% === LSQCURVEFIT 示例 ===
% 本脚本演示了如何使用 lsqcurvefit 对数据进行非线性模型拟合,
% 并展示了如何组织代码以便于修改和理解。
% === 数据 ===
x_data = [1.0000, 1.5000, 2.0000, 2.5000, 3.0000, 3.5000, 4.0000, 4.5000, 5.0000];
y_data = [0.1995, 0.1933, 0.1760, 0.1506, 0.1210, 0.0913, 0.0648, 0.0431, 0.0270];
% === 参数初始化 ===
% 初始猜测的参数 [mu, sigma]
initial_guess = [mean(x_data), std(x_data)];
% === 高斯函数定义 ===
% 高斯函数
gaussian_func = @(params, x) 1./(params(2) * sqrt(2*pi)) * exp(-(x - params(1)).^2 ./ (2*params(2)^2));
% === 执行非线性最小二乘拟合 ===
params_fit = lsqcurvefit(gaussian_func, initial_guess, x_data, y_data);
% 提取拟合得到的参数
mu_fit = params_fit(1);
sigma_fit = params_fit(2);
`fmincon` 是 MATLAB 中用于求解具有约束条件的非线性规划(NLP)问题的函数。它的主要功能是通过优化算法找到目标函数在给定约束条件下的最优解。以下是关于 `fmincon` 函数的详细介绍:
### 功能和用途
`fmincon` 函数用于解决形式如下的非线性规划问题:
\[ \min_x \; f(x) \]
\[ \text{subject to} \; c(x) \leq 0 \]
\[ \qquad \quad \; ceq(x) = 0 \]
\[ \qquad \quad \; lb \leq x \leq ub \]
其中:
- \( f(x) \) 是目标函数,可以是任意的非线性函数。
- \( c(x) \leq 0 \) 是不等式约束集合,可以包含多个不等式约束。
- \( ceq(x) = 0 \) 是等式约束集合,可以包含多个等式约束。
- \( lb \) 和 \( ub \) 分别是变量 \( x \) 的下界和上界。
### 调用语法
```matlab
[x, fval, exitflag, output] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options)
```
- **输入参数**:
- `fun`: 目标函数的句柄或函数名称,如 `fun(x)` 返回目标函数的值。
- `x0`: 变量 \( x \) 的初始值。
- `A`, `b`: 不等式约束矩阵和向量,表示 \( A*x \leq b \)。
- `Aeq`, `beq`: 等式约束矩阵和向量,表示 \( Aeq*x = beq \)。
- `lb`, `ub`: 变量 \( x \) 的下界和上界。
- `nonlcon`: 非线性约束函数的句柄或函数名称,如 `nonlcon(x)` 返回非线性约束的向量形式。
- `options`: 用于指定优化选项的结构体,如算法选择、迭代次数等。
- **输出参数**:
- `x`: 最优解,使得目标函数达到最小值的变量 \( x \)。
- `fval`: 目标函数在最优解处的值,即最小值。
- `exitflag`: 表示优化的退出标志,用于指示优化过程的收敛情况。
- `output`: 结构体,包含了优化过程的详细信息,如迭代次数、收敛信息等。
### 示例
下面是一个简单的示例,演示了如何使用 `fmincon` 函数解决一个带有非线性约束的二元函数优化问题:
```matlab
% 目标函数定义
fun = @(x) x(1)^2 + x(2)^2; % 目标函数 f(x) = x1^2 + x2^2
% 初始点
x0 = [1; 2];
% 非线性约束函数
nonlcon = @(x) x(1) + x(2)^2 - 2; % 非线性约束:x1 + x2^2 <= 2
% 变量的下界和上界
lb = [-10; -10]; % x1 和 x2 的下界
ub = [10; 10]; % x1 和 x2 的上界
% 调用 fmincon 进行求解
options = optimoptions('fmincon', 'Display', 'iter');
[x, fval, exitflag, output] = fmincon(fun, x0, [], [], [], [], lb, ub, nonlcon, options);
% 显示结果
disp(['最优解 x = ', num2str(x')]);
disp(['最优值 f(x) = ', num2str(fval)]);
disp(['退出标志 exitflag = ', num2str(exitflag)]);
```
### 1. 线性规划(linprog)
```matlab
% === 线性规划示例 (linprog) ===
%
% 本脚本演示了如何使用 linprog 解决线性规划问题。
%
% 清空工作区和命令窗口
clear;
clc;
% === 数据 ===
% 目标函数系数
f = [-3; -5];
% 不等式约束 A*x <= b
A = [1, 1; % x1 + x2 <= 4
2, 1; % 2*x1 + x2 <= 7
-1, 2]; % -x1 + 2*x2 <= 3
b = [4; 7; 3];
% 等式约束 Aeq*x = beq
Aeq = [1, -1]; % x1 - x2 = 2
beq = 2;
% 变量的下界和上界
lb = [0; 0]; % x1 >= 0, x2 >= 0
ub = []; % 没有上界
% === 调用 linprog 进行求解 ===
[x, fval, exitflag, output] = linprog(f, A, b, Aeq, beq, lb, ub);
% === 运行结果储存位置 ===
% x: 最优解
% fval: 最优解对应的目标函数值(最小值)
% exitflag: 优化函数的退出标志
% output: 优化过程中的详细信息,例如迭代次数等
```
### 2. 整数线性规划(intlinprog)
```matlab
% === 整数线性规划示例 (intlinprog) ===
%
% 本脚本演示了如何使用 intlinprog 解决整数线性规划问题。
%
% 清空工作区和命令窗口
clear;
clc;
% === 数据 ===
% 目标函数系数
f = [-1; -2; -3];
% 不等式约束 A*x <= b
A = [1, 1, 1; % x1 + x2 + x3 <= 10
-1, 2, 0]; % -x1 + 2*x2 <= 2
b = [10; 2];
% 等式约束 Aeq*x = beq
Aeq = []; % 没有等式约束
beq = [];
% 整数约束
intcon = [1, 2, 3]; % x1, x2, x3 都是整数
% === 调用 intlinprog 进行求解 ===
[x, fval, exitflag, output] = intlinprog(f, intcon, A, b, Aeq, beq);
% === 运行结果储存位置 ===
% x: 最优解
% fval: 最优解对应的目标函数值
% exitflag: 优化函数的退出标志
% output: 优化过程中的详细信息
```
### 3. 0-1规划(bintprog)
```matlab
% === 0-1规划示例 (bintprog) ===
%
% 本脚本演示了如何使用 bintprog 解决0-1规划问题。
%
% 清空工作区和命令窗口
clear;
clc;
% === 数据 ===
% 目标函数系数
f = [-1; -2; -3];
% 不等式约束 A*x <= b
A = [1, 1, 1; % x1 + x2 + x3 <= 10
-1, 2, 0]; % -x1 + 2*x2 <= 2
b = [10; 2];
% 等式约束 Aeq*x = beq
Aeq = []; % 没有等式约束
beq = [];
% 整数约束
intcon = [1, 2, 3]; % x1, x2, x3 都是整数
% === 调用 bintprog 进行求解 ===
[x, fval, exitflag, output] = bintprog(f, A, b, Aeq, beq);
% === 运行结果储存位置 ===
% x: 最优解
% fval: 最优解对应的目标函数值
% exitflag: 优化函数的退出标志
% output: 优化过程中的详细信息
```
% === 非线性规划示例 (fmincon) ===
%
% 本脚本演示了如何使用 fmincon 解决非线性规划问题,包括非线性约束。
%
% 清空工作区和命令窗口
clear;
clc;
% === 数据 ===
% 目标函数定义
fun = @(x) x(1)^2 + x(2)^2; % 目标函数 f(x) = x1^2 + x2^2
% 初始点
x0 = [1; 2];
% 不等式约束 A*x <= b(没有不等式约束,所以为空)
A = [];
b = [];
% 等式约束 Aeq*x = beq(没有等式约束,所以为空)
Aeq = [];
beq = [];
% 非线性约束函数
nonlcon = @(x) x(1) + x(2)^2 - 2; % 非线性约束:x1 + x2^2 <= 2
% 变量的下界和上界
lb = [-10; -10]; % x1 和 x2 的下界
ub = [10; 10]; % x1 和 x2 的上界
% === 调用 fmincon 进行求解 ===
options = optimoptions('fmincon', 'Display', 'iter');
[x, fval, exitflag, output] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options);
% === 显示结果 ===
disp(['最优解 x = ', num2str(x')]);
disp(['最优值 f(x) = ', num2str(fval)]);
disp(['退出标志 exitflag = ', num2str(exitflag)]);
% === 使用 ode45 求解常微分方程组示例 ===
%
% 本脚本演示了如何使用 ode45 求解常微分方程组。
%
% 清空工作区和命令窗口
clear;
clc;
% === 定义常微分方程组 ===
% 定义常微分方程组函数
% y' = f(t, y)
f = @(t, y) [-0.5*y(1) + 0.5*y(2);
0.5*y(1) - 0.5*y(2)];
% 初值条件
t0 = 0; % 初始时间
y0 = [1; 0]; % 初始状态向量 [y1(t0); y2(t0)]
% 时间范围
tspan = [0 10]; % 求解时间段 [t0, tf]
% === 调用 ode45 求解常微分方程组 ===
[t, y] = ode45(f, tspan, y0);
% === 运行结果储存位置 ===
% t: 时间向量,ode45 求解的时间点
% y: 状态变量矩阵,每一行对应一个时间点的状态向量 [y1(t); y2(t)]
本文用于学校的MATLAB开卷考试,为了便于考试查阅资料,现将查阅的资料整合到该网页
% === LSQCURVEFIT 示例 ===
% 本脚本演示了如何使用 lsqcurvefit 对数据进行非线性模型拟合,
% 并展示了如何组织代码以便于修改和理解。
% === 数据 ===
x_data = [1.0000, 1.5000, 2.0000, 2.5000, 3.0000, 3.5000, 4.0000, 4.5000, 5.0000];
y_data = [0.1995, 0.1933, 0.1760, 0.1506, 0.1210, 0.0913, 0.0648, 0.0431, 0.0270];
% === 参数初始化 ===
% 初始猜测的参数 [mu, sigma]
initial_guess = [mean(x_data), std(x_data)];
% === 高斯函数定义 ===
% 高斯函数
gaussian_func = @(params, x) 1./(params(2) * sqrt(2*pi)) * exp(-(x - params(1)).^2 ./ (2*params(2)^2));
% === 执行非线性最小二乘拟合 ===
params_fit = lsqcurvefit(gaussian_func, initial_guess, x_data, y_data);
% 提取拟合得到的参数
mu_fit = params_fit(1);
sigma_fit = params_fit(2);
`fmincon` 是 MATLAB 中用于求解具有约束条件的非线性规划(NLP)问题的函数。它的主要功能是通过优化算法找到目标函数在给定约束条件下的最优解。以下是关于 `fmincon` 函数的详细介绍:
### 功能和用途
`fmincon` 函数用于解决形式如下的非线性规划问题:
\[ \min_x \; f(x) \]
\[ \text{subject to} \; c(x) \leq 0 \]
\[ \qquad \quad \; ceq(x) = 0 \]
\[ \qquad \quad \; lb \leq x \leq ub \]
其中:
- \( f(x) \) 是目标函数,可以是任意的非线性函数。
- \( c(x) \leq 0 \) 是不等式约束集合,可以包含多个不等式约束。
- \( ceq(x) = 0 \) 是等式约束集合,可以包含多个等式约束。
- \( lb \) 和 \( ub \) 分别是变量 \( x \) 的下界和上界。
### 调用语法
```matlab
[x, fval, exitflag, output] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options)
```
- **输入参数**:
- `fun`: 目标函数的句柄或函数名称,如 `fun(x)` 返回目标函数的值。
- `x0`: 变量 \( x \) 的初始值。
- `A`, `b`: 不等式约束矩阵和向量,表示 \( A*x \leq b \)。
- `Aeq`, `beq`: 等式约束矩阵和向量,表示 \( Aeq*x = beq \)。
- `lb`, `ub`: 变量 \( x \) 的下界和上界。
- `nonlcon`: 非线性约束函数的句柄或函数名称,如 `nonlcon(x)` 返回非线性约束的向量形式。
- `options`: 用于指定优化选项的结构体,如算法选择、迭代次数等。
- **输出参数**:
- `x`: 最优解,使得目标函数达到最小值的变量 \( x \)。
- `fval`: 目标函数在最优解处的值,即最小值。
- `exitflag`: 表示优化的退出标志,用于指示优化过程的收敛情况。
- `output`: 结构体,包含了优化过程的详细信息,如迭代次数、收敛信息等。
### 示例
下面是一个简单的示例,演示了如何使用 `fmincon` 函数解决一个带有非线性约束的二元函数优化问题:
```matlab
% 目标函数定义
fun = @(x) x(1)^2 + x(2)^2; % 目标函数 f(x) = x1^2 + x2^2
% 初始点
x0 = [1; 2];
% 非线性约束函数
nonlcon = @(x) x(1) + x(2)^2 - 2; % 非线性约束:x1 + x2^2 <= 2
% 变量的下界和上界
lb = [-10; -10]; % x1 和 x2 的下界
ub = [10; 10]; % x1 和 x2 的上界
% 调用 fmincon 进行求解
options = optimoptions('fmincon', 'Display', 'iter');
[x, fval, exitflag, output] = fmincon(fun, x0, [], [], [], [], lb, ub, nonlcon, options);
% 显示结果
disp(['最优解 x = ', num2str(x')]);
disp(['最优值 f(x) = ', num2str(fval)]);
disp(['退出标志 exitflag = ', num2str(exitflag)]);
```
### 1. 线性规划(linprog)
```matlab
% === 线性规划示例 (linprog) ===
%
% 本脚本演示了如何使用 linprog 解决线性规划问题。
%
% 清空工作区和命令窗口
clear;
clc;
% === 数据 ===
% 目标函数系数
f = [-3; -5];
% 不等式约束 A*x <= b
A = [1, 1; % x1 + x2 <= 4
2, 1; % 2*x1 + x2 <= 7
-1, 2]; % -x1 + 2*x2 <= 3
b = [4; 7; 3];
% 等式约束 Aeq*x = beq
Aeq = [1, -1]; % x1 - x2 = 2
beq = 2;
% 变量的下界和上界
lb = [0; 0]; % x1 >= 0, x2 >= 0
ub = []; % 没有上界
% === 调用 linprog 进行求解 ===
[x, fval, exitflag, output] = linprog(f, A, b, Aeq, beq, lb, ub);
% === 运行结果储存位置 ===
% x: 最优解
% fval: 最优解对应的目标函数值(最小值)
% exitflag: 优化函数的退出标志
% output: 优化过程中的详细信息,例如迭代次数等
```
### 2. 整数线性规划(intlinprog)
```matlab
% === 整数线性规划示例 (intlinprog) ===
%
% 本脚本演示了如何使用 intlinprog 解决整数线性规划问题。
%
% 清空工作区和命令窗口
clear;
clc;
% === 数据 ===
% 目标函数系数
f = [-1; -2; -3];
% 不等式约束 A*x <= b
A = [1, 1, 1; % x1 + x2 + x3 <= 10
-1, 2, 0]; % -x1 + 2*x2 <= 2
b = [10; 2];
% 等式约束 Aeq*x = beq
Aeq = []; % 没有等式约束
beq = [];
% 整数约束
intcon = [1, 2, 3]; % x1, x2, x3 都是整数
% === 调用 intlinprog 进行求解 ===
[x, fval, exitflag, output] = intlinprog(f, intcon, A, b, Aeq, beq);
% === 运行结果储存位置 ===
% x: 最优解
% fval: 最优解对应的目标函数值
% exitflag: 优化函数的退出标志
% output: 优化过程中的详细信息
```
### 3. 0-1规划(bintprog)
```matlab
% === 0-1规划示例 (bintprog) ===
%
% 本脚本演示了如何使用 bintprog 解决0-1规划问题。
%
% 清空工作区和命令窗口
clear;
clc;
% === 数据 ===
% 目标函数系数
f = [-1; -2; -3];
% 不等式约束 A*x <= b
A = [1, 1, 1; % x1 + x2 + x3 <= 10
-1, 2, 0]; % -x1 + 2*x2 <= 2
b = [10; 2];
% 等式约束 Aeq*x = beq
Aeq = []; % 没有等式约束
beq = [];
% 整数约束
intcon = [1, 2, 3]; % x1, x2, x3 都是整数
% === 调用 bintprog 进行求解 ===
[x, fval, exitflag, output] = bintprog(f, A, b, Aeq, beq);
% === 运行结果储存位置 ===
% x: 最优解
% fval: 最优解对应的目标函数值
% exitflag: 优化函数的退出标志
% output: 优化过程中的详细信息
```
% === 非线性规划示例 (fmincon) ===
%
% 本脚本演示了如何使用 fmincon 解决非线性规划问题,包括非线性约束。
%
% 清空工作区和命令窗口
clear;
clc;
% === 数据 ===
% 目标函数定义
fun = @(x) x(1)^2 + x(2)^2; % 目标函数 f(x) = x1^2 + x2^2
% 初始点
x0 = [1; 2];
% 不等式约束 A*x <= b(没有不等式约束,所以为空)
A = [];
b = [];
% 等式约束 Aeq*x = beq(没有等式约束,所以为空)
Aeq = [];
beq = [];
% 非线性约束函数
nonlcon = @(x) x(1) + x(2)^2 - 2; % 非线性约束:x1 + x2^2 <= 2
% 变量的下界和上界
lb = [-10; -10]; % x1 和 x2 的下界
ub = [10; 10]; % x1 和 x2 的上界
% === 调用 fmincon 进行求解 ===
options = optimoptions('fmincon', 'Display', 'iter');
[x, fval, exitflag, output] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options);
% === 显示结果 ===
disp(['最优解 x = ', num2str(x')]);
disp(['最优值 f(x) = ', num2str(fval)]);
disp(['退出标志 exitflag = ', num2str(exitflag)]);
% === 使用 ode45 求解常微分方程组示例 ===
%
% 本脚本演示了如何使用 ode45 求解常微分方程组。
%
% 清空工作区和命令窗口
clear;
clc;
% === 定义常微分方程组 ===
% 定义常微分方程组函数
% y' = f(t, y)
f = @(t, y) [-0.5*y(1) + 0.5*y(2);
0.5*y(1) - 0.5*y(2)];
% 初值条件
t0 = 0; % 初始时间
y0 = [1; 0]; % 初始状态向量 [y1(t0); y2(t0)]
% 时间范围
tspan = [0 10]; % 求解时间段 [t0, tf]
% === 调用 ode45 求解常微分方程组 ===
[t, y] = ode45(f, tspan, y0);
% === 运行结果储存位置 ===
% t: 时间向量,ode45 求解的时间点
% y: 状态变量矩阵,每一行对应一个时间点的状态向量 [y1(t); y2(t)]