lsqnonlin
求解非线性最小二乘(非线性数据拟合)问题
语法
说明
非线性最小二乘求解器
求解以下形式的非线性最小二乘曲线拟合问题
需满足以下约束
x、lb
和 ub
可以是向量或矩阵;请参阅矩阵参量。
不要将目标函数指定为标量值 (平方和)。lsqnonlin
要求目标函数是向量值函数
示例
对数据进行简单的指数衰减曲线拟合。
从添加了噪声的指数衰减模型生成数据。模型是
其中 的范围是从 0 到 3, 是均值为 0、标准差为 0.05 的正态分布噪声。
rng default % for reproducibility d = linspace(0,3); y = exp(-1.3*d) + 0.05*randn(size(d));
问题表述为:给定数据(d
、y
),求出与数据拟合最佳的指数衰减率。
创建一个匿名函数,该函数接受指数衰减率 的值作为输入,并返回采用该衰减率的模型与数据之差组成的向量。
fun = @(r)exp(-d*r)-y;
找到最佳衰减率的值。任意选择一个初始估计值 x0
= 4。
x0 = 4; x = lsqnonlin(fun,x0)
Local minimum possible. lsqnonlin stopped because the final change in the sum of squares relative to its initial value is less than the value of the function tolerance. <stopping criteria details>
x = 1.2645
绘制数据和最佳拟合指数曲线。
plot(d,y,'ko',d,exp(-x*d),'b-') legend('Data','Best fit') xlabel('t') ylabel('exp(-tx)')
当某些拟合参数有边界时,找到最佳拟合模型。
找到合适的中心化参数 和缩放参数 ,以便以下函数
最好地拟合以下标准正态密度分布:
创建数据点组成的向量 t
,以及在这些点上的对应正态密度。
t = linspace(-4,4); y = 1/sqrt(2*pi)*exp(-t.^2/2);
创建一个缩放参数 为 x(1)
且中心化参数 为 x(2)
的函数,来计算中心化并缩放的函数与正态 y
之间的差。
fun = @(x)x(1)*exp(-t).*exp(-exp(-(t-x(2)))) - y;
从 x0
= [1/2,0]
开始寻找最佳拟合,缩放参数 的值介于 1/2 和 3/2 之间,中心化参数 的值介于 -1 和 3 之间。
lb = [1/2,-1]; ub = [3/2,3]; x0 = [1/2,0]; x = lsqnonlin(fun,x0,lb,ub)
Local minimum possible. lsqnonlin stopped because the final change in the sum of squares relative to its initial value is less than the value of the function tolerance. <stopping criteria details>
x = 1×2
0.8231 -0.2444
绘制这两个函数来查看拟合的质量。
plot(t,y,'r-',t,fun(x)+y,'b-') xlabel('t') legend('Normal density','Fitted function')
以下列目标函数为例(求平方和):
此目标函数的代码在此示例末尾显示为 myfun
函数。
在满足线性约束 的条件下最小化此函数。将此约束编写为 。
A = [1 -1/2]; b = 0;
施加边界 、、 和 。
lb = [0 0]; ub = [2 4];
从点 x0 = [0.3 0.4]
启动优化过程。
x0 = [0.3 0.4];
此问题没有线性等式约束。
Aeq = []; beq = [];
运行优化。
x = lsqnonlin(@myfun,x0,lb,ub,A,b,Aeq,beq)
Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
x = 1×2
0.1695 0.3389
function F = myfun(x) k = 1:10; F = 2 + 2*k - exp(k*x(1)) - 2*exp(2*k*(x(2)^2)); end
以下列目标函数为例(求平方和):
此目标函数的代码在此示例末尾显示为 myfun
函数。
在满足非线性约束 的条件下最小化此函数。此非线性约束函数的代码在此示例末尾显示为 nlcon
函数。
施加边界 、、 和 。
lb = [0 0]; ub = [2 4];
从点 x0 = [0.3 0.4]
启动优化过程。
x0 = [0.3 0.4];
该问题没有线性约束。
A = []; b = []; Aeq = []; beq = [];
运行优化。
x = lsqnonlin(@myfun,x0,lb,ub,A,b,Aeq,beq,@nlcon)
Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
x = 1×2
0.2133 0.3266
function F = myfun(x) k = 1:10; F = 2 + 2*k - exp(k*x(1)) - 2*exp(2*k*(x(2)^2)); end function [c,ceq] = nlcon(x) ceq = []; c = sin(x(1)) - cos(x(2)); end
比较使用不同 lsqnonlin
算法求解数据拟合问题的结果。
假设您有观测时间数据 xdata
和观测响应数据 ydata
,并且要求得参数 和 以拟合以下形式的模型
输入观测时间和响应。
xdata = ... [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3]; ydata = ... [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];
创建简单的指数衰减模型。该模型计算预测值和观测值之间的差组成的向量。
fun = @(x)x(1)*exp(x(2)*xdata)-ydata;
以 x0 = [100,-1]
为起点拟合模型。首先,使用默认的 'trust-region-reflective'
算法。
x0 = [100,-1]; options = optimoptions(@lsqnonlin,'Algorithm','trust-region-reflective'); x = lsqnonlin(fun,x0,[],[],options)
Local minimum possible. lsqnonlin stopped because the final change in the sum of squares relative to its initial value is less than the value of the function tolerance. <stopping criteria details>
x = 1×2
498.8309 -0.1013
使用 'levenberg-marquardt'
算法查看是否有任何不同。
options.Algorithm = 'levenberg-marquardt';
x = lsqnonlin(fun,x0,[],[],options)
Local minimum possible. lsqnonlin stopped because the relative size of the current step is less than the value of the step size tolerance. <stopping criteria details>
x = 1×2
498.8309 -0.1013
这两种算法找到相同的解。绘制解和数据。
plot(xdata,ydata,'ko') hold on tlist = linspace(xdata(1),xdata(end)); plot(tlist,x(1)*exp(x(2)*tlist),'b-') xlabel xdata ylabel ydata title('Exponential Fit to Data') legend('Data','Exponential Fit') hold off
求最小化下式的
,
并求最小平方和的值。
由于 lsqnonlin
假设平方和不在用户定义的函数中显式得出,因此传递给 lsqnonlin
的函数应计算向量值函数
,
其中 到 (即 应包含 个分量)。
myfun
函数位于此示例末尾,它用于计算包含 10 个分量的向量 F。
从 x0 = [0.3,0.4]
点开始,求最小化点和对应的最小值。
x0 = [0.3,0.4]; [x,resnorm] = lsqnonlin(@myfun,x0)
Local minimum possible. lsqnonlin stopped because the size of the current step is less than the value of the step size tolerance. <stopping criteria details>
x = 1×2
0.2578 0.2578
resnorm = 124.3622
resnorm
输出是残差范数的平方,或函数值的平方和。
以下函数计算向量值目标函数。
function F = myfun(x) k = 1:10; F = 2 + 2*k-exp(k*x(1))-exp(k*x(2)); end
在求解过程发生时和发生后都对其进行检查(通过将 Display
选项设置为 'iter'
在发生时进行检查,通过检查 output
结构体在发生后进行检查)。
假设您有观测时间数据 xdata
和观测响应数据 ydata
,并且要求得参数 和 以拟合以下形式的模型
输入观测时间和响应。
xdata = ... [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3]; ydata = ... [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];
创建简单的指数衰减模型。该模型计算预测值和观测值之间的差组成的向量。
fun = @(x)x(1)*exp(x(2)*xdata)-ydata;
以 x0 = [100,-1]
为起点拟合模型。通过将 Display
选项设置为 'iter'
来检查求解过程。获取 output
结构体以获取有关求解过程的详细信息。
x0 = [100,-1]; options = optimoptions('lsqnonlin','Display','iter'); [x,resnorm,residual,exitflag,output] = lsqnonlin(fun,x0,[],[],options);
Norm of First-order Iteration Func-count Resnorm step optimality 0 3 359677 2.88e+04 Objective function returned Inf; trying a new point... 1 6 359677 11.6976 2.88e+04 2 9 321395 0.5 4.97e+04 3 12 321395 1 4.97e+04 4 15 292253 0.25 7.06e+04 5 18 292253 0.5 7.06e+04 6 21 270350 0.125 1.15e+05 7 24 270350 0.25 1.15e+05 8 27 252777 0.0625 1.63e+05 9 30 252777 0.125 1.63e+05 10 33 243877 0.03125 7.48e+04 11 36 243660 0.0625 8.7e+04 12 39 243276 0.0625 2e+04 13 42 243174 0.0625 1.14e+04 14 45 242999 0.125 5.1e+03 15 48 242661 0.25 2.04e+03 16 51 241987 0.5 1.91e+03 17 54 240643 1 1.04e+03 18 57 237971 2 3.36e+03 19 60 232686 4 6.04e+03 20 63 222354 8 1.2e+04 21 66 202592 16 2.25e+04 22 69 166443 32 4.05e+04 23 72 106320 64 6.68e+04 24 75 28704.7 128 8.31e+04 25 78 89.7947 140.674 2.22e+04 26 81 9.57381 2.02599 684 27 84 9.50489 0.0619927 2.27 28 87 9.50489 0.000462261 0.0114 Local minimum possible. lsqnonlin stopped because the final change in the sum of squares relative to its initial value is less than the value of the function tolerance. <stopping criteria details>
检查输出结构体以获得有关求解过程的详细信息。
output
output = struct with fields:
firstorderopt: 0.0114
iterations: 28
funcCount: 87
cgiterations: 0
algorithm: 'trust-region-reflective'
stepsize: 4.6226e-04
message: 'Local minimum possible.↵↵lsqnonlin stopped because the final change in the sum of squares relative to ↵its initial value is less than the value of the function tolerance.↵↵<stopping criteria details>↵↵Optimization stopped because the relative sum of squares (r) is changing↵by less than options.FunctionTolerance = 1.000000e-06.'
bestfeasible: []
constrviolation: []
为便于比较,请将 Algorithm
选项设置为 'levenberg-marquardt'
。
options.Algorithm = 'levenberg-marquardt';
[x,resnorm,residual,exitflag,output] = lsqnonlin(fun,x0,[],[],options);
First-order Norm of Iteration Func-count Resnorm optimality Lambda step 0 3 359677 2.88e+04 0.01 Objective function returned Inf; trying a new point... 1 13 340761 3.91e+04 100000 0.280777 2 16 304661 5.97e+04 10000 0.373146 3 21 297292 6.55e+04 1e+06 0.0589933 4 24 288240 7.57e+04 100000 0.0645444 5 28 275407 1.01e+05 1e+06 0.0741266 6 31 249954 1.62e+05 100000 0.094571 7 36 245896 1.35e+05 1e+07 0.0133606 8 39 243846 7.26e+04 1e+06 0.0094431 9 42 243568 5.66e+04 100000 0.0082162 10 45 243424 1.61e+04 10000 0.00777935 11 48 243322 8.8e+03 1000 0.0673933 12 51 242408 5.1e+03 100 0.675209 13 54 233628 1.05e+04 10 6.59804 14 57 169089 8.51e+04 1 54.6992 15 60 30814.7 1.54e+05 0.1 196.939 16 63 147.496 8e+03 0.01 129.795 17 66 9.51503 117 0.001 9.96069 18 69 9.50489 0.0714 0.0001 0.080486 19 72 9.50489 5.23e-05 1e-05 5.07043e-05 Local minimum possible. lsqnonlin stopped because the relative size of the current step is less than the value of the step size tolerance. <stopping criteria details>
'levenberg-marquardt'
经过较少迭代次数即实现收敛,但迭代次数与函数计算次数几乎相同:
output
output = struct with fields:
iterations: 19
funcCount: 72
stepsize: 5.0704e-05
cgiterations: []
firstorderopt: 5.2319e-05
algorithm: 'levenberg-marquardt'
message: 'Local minimum possible.↵lsqnonlin stopped because the relative size of the current step is less than↵the value of the step size tolerance.↵↵<stopping criteria details>↵↵Optimization stopped because the relative norm of the current step, 1.016463e-07,↵is less than options.StepTolerance = 1.000000e-06.'
bestfeasible: []
constrviolation: []
输入参数
要最小化其平方和的函数,指定为函数句柄或函数名称。对于 'interior-point'
算法,fun
必须为函数句柄。fun
函数接受数组 x
,并返回数组 F
,即在 x
处计算的目标函数值。
注意
平方和不应显式得出。您的函数应返回由函数值组成的向量。请参阅示例。
函数 fun
可以指定为文件的函数句柄:
x = lsqnonlin(@myfun,x0)
其中 myfun
是一个 MATLAB® 函数,例如
function F = myfun(x) F = ... % Compute function values at x
fun
也可以是匿名函数的函数句柄。
x = lsqnonlin(@(x)sin(x.*x),x0);
lsqnonlin
以 x0
参量的形状将 x
传递给目标函数。例如,如果 x0
是 5×3 数组,则 lsqnonlin
将 x
以 5×3 数组的形式传递给 fun
。
如果雅可比矩阵也可以计算并且 'SpecifyObjectiveGradient'
选项为 true
,设置如下
options = optimoptions('lsqnonlin','SpecifyObjectiveGradient',true)
则函数 fun
必须返回第二个输出参量,即在 x
处计算的雅可比值矩阵 J
。通过检查 nargout
的值,当仅使用一个输出参量调用 fun
时(在优化算法只需 F
的值而不需要 J
的情况下),该函数可以避免计算 J
。
function [F,J] = myfun(x) F = ... % Objective function values at x if nargout > 1 % Two output arguments J = ... % Jacobian of the function evaluated at x end
如果 fun
返回由 m
个分量组成的数组且 x
包含 n
个元素,其中 n
是 x0
的元素数,则雅可比J
是 m
×n
矩阵,其中 J(i,j)
是 F(i)
关于 x(j)
的偏导数。(雅可比值 J
是 F
的梯度的转置。)
示例: @(x)cos(x).*exp(-x)
数据类型: char
| function_handle
| string
初始点,指定为实数向量或实数数组。求解器使用 x0
中的元素数量和 x0
的大小来确定 fun
接受的变量数量和大小。
示例: x0 = [1,2,3,4]
数据类型: double
下界,指定为实数向量或实数数组。如果 x0
中的元素数等于 lb
中的元素数,则 lb
指定
x(i) >= lb(i)
(对于全部 i
)。
如果 numel(lb) < numel(x0)
,则 lb
指定
x(i) >= lb(i)
(1 <= i <= numel(lb)
)。
如果 lb
的元素数少于 x0
,求解器将发出警告。
示例: 要指定所有 x 分量为正,请使用 lb = zeros(size(x0))
。
数据类型: single
| double
上界,指定为实数向量或实数数组。如果 x0
中的元素数等于 ub
中的元素数,则 ub
指定
x(i) <= ub(i)
(对于全部 i
)。
如果 numel(ub) < numel(x0)
,则 ub
指定
x(i) <= ub(i)
(1 <= i <= numel(ub)
)。
如果 ub
的元素数少于 x0
,求解器将发出警告。
示例: 要指定 x 的所有分量小于 1,请使用 ub = ones(size(x0))
。
数据类型: single
| double
线性不等式约束,指定为实矩阵。A
是 M
×N
矩阵,其中 M
是不等式的数目,而 N
是变量的数目(x0
中的元素数)。对于大型问题,如果使用支持稀疏数据的算法,则可将 A
作为稀疏矩阵传递。请参阅稀疏性在优化算法中的应用。
A
以如下形式编写 M
个线性不等式
A*x <= b
,
其中,x
是由 N
个变量组成的列向量 x(:)
,b
是具有 M
个元素的列向量。
例如,假设有以下不等式:
x1 +2x2 ≤10
3x1 +4x2 ≤20
5x1 +6x2 ≤30,
通过输入以下约束来指定不等式。
A = [1,2;3,4;5,6]; b = [10;20;30];
示例: 要指定 x 分量总和等于或小于 1,请使用 A = ones(1,N)
和 b = 1
。
数据类型: single
| double
线性不等式约束,指定为实数向量。b
是与 A
矩阵相关的包含 M
个元素的向量。如果将 b
作为行向量传递,求解器会在内部将 b
转换为列向量 b(:)
。
b
以如下形式编写 M
个线性不等式
A*x <= b
,
其中,x
是由 N
个变量组成的列向量 x(:)
,A
是大小为 M
×N
的矩阵。
例如,假设有以下不等式:
x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30。
通过输入以下约束来指定不等式。
A = [1,2;3,4;5,6]; b = [10;20;30];
示例: 要指定 x 分量总和等于或小于 1,请使用 A = ones(1,N)
和 b = 1
。
数据类型: single
| double
线性等式约束,指定为实矩阵。Aeq
是 Me
×N
矩阵,其中 Me
是等式的数目,而 N
是变量的数目(x0
中的元素数)。对于大型问题,如果使用支持稀疏数据的算法,则可将 A
作为稀疏矩阵传递。请参阅稀疏性在优化算法中的应用。
Aeq
以如下形式编写 Me
个线性等式
Aeq*x = beq
,
其中,x
是由 N
个变量组成的列向量 x(:)
,beq
是具有 Me
个元素的列向量。
例如,假设有以下不等式:
x1 +2x2 +3x3 =10
2x1 +4x2 + x3 =20,
通过输入以下约束来指定不等式。
Aeq = [1,2,3;2,4,1]; beq = [10;20];
示例: 要指定 x 分量总和为 1,请使用 Aeq = ones(1,N)
和 beq = 1
。
数据类型: single
| double
线性等式约束,指定为实数向量。beq
是与 Aeq
矩阵相关的包含 Me
个元素的向量。如果将 beq
作为行向量传递,求解器会在内部将 beq
转换为列向量 beq(:)
。
beq
以如下形式编写 Me
个线性等式
Aeq*x = beq
,
其中,x
是由 N
个变量组成的列向量 x(:)
,Aeq
是大小为 Me
×N
的矩阵。
例如,请参考以下等式:
x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20。
通过输入以下约束来指定等式。
Aeq = [1,2,3;2,4,1]; beq = [10;20];
示例: 要指定 x 分量总和为 1,请使用 Aeq = ones(1,N)
和 beq = 1
。
数据类型: single
| double
非线性约束,指定为函数句柄。nonlcon
函数接受向量或数组 x
,并返回两个数组 c(x)
和 ceq(x)
。
c(x)
是由x
处的非线性不等式约束组成的数组。lsqnonlin
尝试满足对于 c
的所有项,有c(x) <= 0
。(1) ceq(x)
是由x
处的非线性等式约束组成的数组。lsqnonlin
尝试满足对于 ceq
的所有项,有ceq(x) = 0
。(2)
例如,
x = lsqnonlin(@myfun,x0,lb,ub,A,b,Aeq,beq,@mycon,options)
其中 mycon
是一个 MATLAB 函数,例如
function [c,ceq] = mycon(x) c = ... % Compute nonlinear inequalities at x. ceq = ... % Compute nonlinear equalities at x.
SpecifyConstraintGradient
选项是 true
,设置如下:options = optimoptions('lsqnonlin','SpecifyConstraintGradient',true)
nonlcon
还必须在第三个和第四个输出参量中返回 GC
(即 c(x)
的雅可比矩阵)和 GCeq
(即 ceq(x)
的雅可比矩阵)。向量函数 F(x) 的雅可比矩阵 G(x) 是GC
和 GCeq
可以是稀疏或稠密矩阵。如果 GC
或 GCeq
较大,非零项相对较少,则通过将它们表示为稀疏矩阵,可以节省 'interior-point'
算法的运行时间和内存使用量。有关详细信息,请参阅非线性约束。
数据类型: function_handle
优化选项,指定为 optimoptions
的输出或 optimset
返回的结构体。
一些选项适用于所有算法,其他选项则与特定算法相关。有关详细信息,请参阅优化选项参考。
optimoptions
显示中缺少某些选项。这些选项在下表中以斜体显示。有关详细信息,请参阅查看优化选项。
所有算法 | |
| 在
只有 有关选择算法的详细信息,请参阅选择算法。 |
CheckGradients | 将用户提供的导数(目标或约束的梯度)与有限差分导数进行比较。选项是 对于 以后的版本中将会删除 |
Diagnostics | 显示关于要最小化或求解的函数的诊断信息。选项是 |
DiffMaxChange | 有限差分梯度变量的最大变化(正标量)。默认值为 |
DiffMinChange | 有限差分梯度变量的最小变化(正标量)。默认值为 |
| 显示级别(请参阅迭代输出):
|
FiniteDifferenceStepSize | 有限差分的标量或向量步长因子。当您将
sign′(x) = sign(x) (例外是 sign′(0) = 1 )。中心有限差分是
FiniteDifferenceStepSize 扩展为向量。对于正向有限差分,默认值为 sqrt(eps) ;对于中心有限差分,默认值为 eps^(1/3) 。 对于 |
FiniteDifferenceType | 用于估计梯度的有限差分是 当同时估计这两种类型的有限差分时,该算法小心地遵守边界。因此,例如,为了避免在边界之外的某个点进行计算,它可能采取一个后向差分,而不是前向差分。 对于 |
| 函数值的终止容差,非负标量。默认值为 对于 |
FunValCheck | 检查函数值是否有效。当函数返回的值是 |
| 允许的最大函数计算次数,非负整数。对于 对于 |
| 允许的最大迭代次数,非负整数。对于 对于 |
OptimalityTolerance | 一阶最优性的终止容差(非负标量)。默认值为
对于 |
OutputFcn | 指定优化函数在每次迭代中调用的一个或多个用户定义的函数。传递函数句柄或函数句柄的元胞数组。默认值是“无”( |
| 对算法执行过程中的各种进度测量值绘图,可以选择预定义的绘图,也可以自行编写绘图函数。传递名称、函数句柄或者由名称或函数句柄组成的元胞数组。对于自定义绘图函数,传递函数句柄。默认值是“无”(
自定义绘图函数使用与输出函数相同的语法。请参阅Optimization Toolbox 的输出函数和输出函数和绘图函数语法。 对于 |
SpecifyObjectiveGradient | 如果为 对于 |
|
对于 |
| 典型的 |
UseParallel | 当为 |
信赖域反射算法 | |
JacobianMultiplyFcn | 雅可比矩阵乘法函数,指定为函数句柄。对于大规模结构问题,此函数计算雅可比矩阵乘积 W = jmfun(Jinfo,Y,flag) 其中 W = jmfun(Jinfo,Y,flag,xdata) 其中 数据 [F,Jinfo] = fun(x)
% or [F,Jinfo] = fun(x,xdata)
在每种情况下,都不会显式形成 注意
有关类似示例,请参阅使用密集结构 Hessian 和线性等式进行最小化和雅可比乘法函数与线性最小二乘法。 对于 |
JacobPattern | 用于有限差分的雅可比矩阵稀疏模式。当 如果在 如果结构未知,请不要设置 |
MaxPCGIter | PCG(预条件共轭梯度)迭代的最大次数,正标量。默认值为 |
PrecondBandWidth | PCG 的预条件子上带宽,非负整数。 |
SubproblemAlgorithm | 确定迭代步的计算方式。相比 |
TolPCG | PCG 迭代的终止容差,正标量。默认值为 |
莱文贝格-马夸特算法 | |
InitDamping | 莱文贝格-马夸特参数的初始值,正标量。默认值是 |
ScaleProblem |
|
内点算法 | |
BarrierParamUpdate | 指定
此选项会影响求解器的速度和收敛,但效果不容易预测。 |
ConstraintTolerance | 约束违反值的容差,非负标量。默认值为 对于 |
InitBarrierParam | 初始障碍值,正标量。有时尝试高于默认值 |
SpecifyConstraintGradient | 用户定义的非线性约束函数梯度。当设置为默认值 对于 |
SubproblemAlgorithm | 确定迭代步的计算方式。默认值 对于 |
示例: options = optimoptions('lsqnonlin','FiniteDifferenceType','central')
问题结构体,指定为含有以下字段的结构体:
字段名称 | 条目 |
---|---|
| 目标函数 |
| x 的初始点 |
| 线性不等式约束的矩阵 |
| 线性不等式约束的向量 |
| 线性等式约束的矩阵 |
| 线性等式约束的向量 |
lb | 由下界组成的向量 |
ub | 由上界组成的向量 |
| 非线性约束函数 |
| 'lsqnonlin' |
| 用 optimoptions 创建的选项 |
您必须在 problem
结构体中至少提供 objective
、x0
、solver
和 options
字段。
数据类型: struct
输出参量
残差范数的平方,以非负实数形式返回。resnorm
是在 x
处的残差的 2-范数平方:sum(fun(x).^2)
。
在解处的目标函数值,以数组形式返回。一般来说,residual = fun(x)
。
求解器停止的原因,以整数形式返回。
| 函数收敛于解 |
|
|
| 残差中的变化小于指定的容差。 |
| 搜索方向的相对量级小于步长容差。 |
| 迭代次数超过 |
| 绘图函数或输出函数停止了求解器。 |
| 找不到可行点。边界 |
有关优化过程的信息,以包含下列字段的结构体形式返回:
firstorderopt | 一阶最优性的测度 |
iterations | 执行的迭代次数 |
funcCount | 函数计算的次数 |
cgiterations | PCG 迭代总次数(适用于 |
stepsize |
|
constrviolation | 约束函数的最大值( |
bestfeasible | 遇到的最佳(目标函数值最低)可行点(
如果找不到可行点,则 |
algorithm | 使用的优化算法 |
message | 退出消息 |
解处的雅可比矩阵,以实矩阵形式返回。jacobian(i,j)
是 fun(i)
关于解 x
处的 x(j)
的偏导数。
对于在解处有活动约束的问题,jacobian
不适用于估计置信区间。
限制
信赖域反射算法不能求解欠定方程组;它要求方程个数(即 F 的行维度)至少与变量个数一样。在欠定的情况下,
lsqnonlin
使用莱文贝格-马夸特算法。lsqnonlin
可以直接求解复数值问题。请注意,约束对于复数值没有意义,因为复数不能很好地排序;询问一个复数值是大于还是小于另一个复数值没有意义。对于具有边界约束的复数问题,请将变量分成实部和虚部。不要对复数数据使用'interior-point'
算法。请参阅对复数值数据进行模型拟合。信赖域反射方法的预条件共轭梯度部分中使用的预条件子计算在计算预条件子之前形成 JTJ(其中 J 是雅可比矩阵)。因此,如果 J 的一行包含许多非零值(这会导致近乎稠密的乘积 JTJ),则可能导致大型问题的求解过程成本高昂。
如果 x 的分量没有上界(或下界),
lsqnonlin
更倾向于ub
(或lb
)的对应分量设置为inf
(对于下界,则为-inf
),而不是任意但非常大的正数(对于下界,则为负数)。
您可以在 lsqnonlin
、lsqcurvefit
、fsolve
中使用信赖域反射算法求解中小规模问题,而无需计算 fun
中的雅可比矩阵或提供雅可比矩阵稀疏模式。(这也适用于使用 fmincon
或 fminunc
而不计算黑塞矩阵或提供黑塞矩阵稀疏模式的情况。)中小规模有多小?没有绝对的答案,因为这取决于您的计算机系统配置中的虚拟内存量。
假设您的问题有 m
个方程和 n
个未知数。如果命令 J = sparse(ones(m,n))
导致您的计算机上出现 Out of memory
错误,则这肯定是因为问题太大。即使它没有导致错误,问题仍可能太大。只有运行它并查看 MATLAB 是否在系统可用的虚拟内存量内运行,您才能找到答案。
详细信息
接下来的几项列出了可能增强的退出消息 lsqnonlin
。增强的退出消息在消息的第一句中给出了详细信息的链接。
求解器可能已经达到了 局部最小值 但不能确定,因为 一阶最优性测度 不小于 OptimalityTolerance容差(Levenberg-Marquardt 算法的 OptimalityTolerance
为 1e-4*)。
有关如何继续的建议,请参阅可能是局部最小值。
接下来的几项包含以下术语的定义 lsqnonlin
退出消息。
函数的局部最小值是指这样的一个点:其函数值小于附近的点,但可能大于远处的点。
全局最小值是函数值小于所有其他可行点的点。
求解器尝试找到局部最小值。该结果也可能是全局最小值。有关详细信息,请参阅局部最优与全局最优。
对于无约束问题,一阶最优性测度是梯度向量分量绝对值的最大值(也称为梯度的无穷范数)。在最小化点处,此值应为零。
对于有边界问题,一阶最优性测度是最大值除以 |vi*gi| 的 i。此处,gi 是梯度的第 i 个分量,x 是当前点,并且
如果 xi 位于边界上,则 vi 为零。如果 xi 不在边界上,则在最小化点上,梯度 gi 应为零。因此,一阶最优性测度在最小化点上应为零。
有关详细信息,请参阅一阶最优性测度。
一般来说,容差是一个阈值,超过阈值时将终止求解器的迭代。有关容差的详细信息,请参阅容差和停止条件。
名为 OptimalityTolerance
的公差与 一阶最优性测度 相关。当一阶最优性测度小于 OptimalityTolerance
时,迭代结束。
函数 容差 称为 FunctionTolerance
与目标函数值的最新变化的大小有关。
梯度向量是平方和梯度。对于无约束问题,梯度大小是梯度向量分量绝对值的最大值(也称为梯度的无穷范数)。在最小化点处,此值应为零。
对于有边界的问题,梯度大小是最大值除以 |vi*gi| 的 i。此处,gi 是梯度的第 i 个分量,x 是当前点,并且
如果 xi 位于边界上,则 vi 为零。如果 xi 不在边界上,则在最小化点上,梯度 gi 应为零。因此,梯度大小在最小化点处应为零。
有关详细信息,请参阅一阶最优性测度。
当前步长的大小是最后一次迭代中当前点位置变化的幅度。
有关详细信息,请参阅容差和停止条件。
Levenberg-Marquardt 正则化参数与信赖域半径的倒数相关。当函数值的平方和未接近二次模型时,它会变大。有关详细信息,请参阅莱文贝格-马夸特方法。
求解器通过取有限差分来估计目标向量函数的雅可比矩阵。有限差分计算在目标函数良好定义的区域之外进行,返回 Inf
、NaN
或复数结果。
有关求解器如何使用雅可比矩阵 J 的详细信息,请参阅 莱文贝格-马夸特方法 。有关如何继续的建议,请参阅6.提供梯度或雅可比矩阵。
算法
莱文贝格-马夸特和信赖域反射方法基于非线性最小二乘算法,这些算法也在 fsolve
中使用。
'interior-point'
算法使用 fmincon
'interior-point'
算法,但有一些修正。有关详细信息,请参阅针对约束最小二乘修正的 fmincon 算法。
替代功能
App
优化实时编辑器任务为 lsqnonlin
提供了一个可视化界面。
参考
[1] Coleman, T.F. and Y. Li. “An Interior, Trust Region Approach for Nonlinear Minimization Subject to Bounds.” SIAM Journal on Optimization, Vol. 6, 1996, pp. 418–445.
[2] Coleman, T.F. and Y. Li. “On the Convergence of Reflective Newton Methods for Large-Scale Nonlinear Minimization Subject to Bounds.” Mathematical Programming, Vol. 67, Number 2, 1994, pp. 189–224.
[3] Dennis, J. E. Jr. “Nonlinear Least-Squares.” State of the Art in Numerical Analysis, ed. D. Jacobs, Academic Press, pp. 269–312.
[4] Levenberg, K. “A Method for the Solution of Certain Problems in Least-Squares.” Quarterly Applied Mathematics 2, 1944, pp. 164–168.
[5] Marquardt, D. “An Algorithm for Least-squares Estimation of Nonlinear Parameters.” SIAM Journal Applied Mathematics, Vol. 11, 1963, pp. 431–441.
[6] Moré, J. J. “The Levenberg-Marquardt Algorithm: Implementation and Theory.” Numerical Analysis, ed. G. A. Watson, Lecture Notes in Mathematics 630, Springer Verlag, 1977, pp. 105–116.
[7] Moré, J. J., B. S. Garbow, and K. E. Hillstrom. User Guide for MINPACK 1. Argonne National Laboratory, Rept. ANL–80–74, 1980.
[8] Powell, M. J. D. “A Fortran Subroutine for Solving Systems of Nonlinear Algebraic Equations.” Numerical Methods for Nonlinear Algebraic Equations, P. Rabinowitz, ed., Ch.7, 1970.
扩展功能
lsqcurvefit
和lsqnonlin
支持使用codegen
(MATLAB Coder) 函数或 MATLAB Coder™ 生成代码。您必须拥有 MATLAB Coder 许可证才能生成代码。目标硬件必须支持标准双精度浮点计算。您不能为单精度或定点计算生成代码。
代码生成目标与 MATLAB 求解器不使用相同的数学核心函数库。因此,代码生成解可能不同于求解器解,尤其是对于病态问题。
生成的所有代码必须为 MATLAB 代码。特别是,您不能将自定义黑盒函数用作
lsqcurvefit
或lsqnonlin
的目标函数。您可以使用coder.ceval
计算用 C 或 C++ 编码的自定义函数。但是,自定义函数必须在 MATLAB 函数中调用。lsqcurvefit
和lsqnonlin
的代码生成当前不支持线性或非线性约束。在生成代码时,
lsqcurvefit
和lsqnonlin
不支持problem
参量。[x,fval] = lsqnonlin(problem) % Not supported
您必须使用函数句柄(而不是字符串或字符名称)来指定目标函数。
x = lsqnonlin(@fun,x0,lb,ub,options) % Supported % Not supported: lsqnonlin('fun',...) or lsqnonlin("fun",...)
所有输入矩阵
lb
和ub
都必须是满矩阵,而不能是稀疏矩阵。您可以使用full
函数将稀疏矩阵转换为满矩阵。lb
和ub
参量的条目数必须与x0
参量相同,或必须为空[]
。如果您的目标硬件不支持无限边界,请使用
optim.coder.infbound
。对于涉及嵌入式处理器的高级代码优化,您还需要 Embedded Coder® 许可证。
您必须包括适用于
lsqcurvefit
或lsqnonlin
的选项,并使用optimoptions
指定这些选项。选项中必须包括Algorithm
并将其设置为'levenberg-marquardt'
。options = optimoptions('lsqnonlin','Algorithm','levenberg-marquardt'); [x,fval,exitflag] = lsqnonlin(fun,x0,lb,ub,options);
代码生成支持以下选项:
Algorithm
- 必须为'levenberg-marquardt'
FiniteDifferenceStepSize
FiniteDifferenceType
FunctionTolerance
MaxFunctionEvaluations
MaxIterations
SpecifyObjectiveGradient
StepTolerance
TypicalX
生成的代码只会对选项进行有限的错误检查。更新选项的推荐方法是使用
optimoptions
,而不是圆点表示法。opts = optimoptions('lsqnonlin','Algorithm','levenberg-marquardt'); opts = optimoptions(opts,'MaxIterations',1e4); % Recommended opts.MaxIterations = 1e4; % Not recommended
不要从文件中加载选项。否则会导致代码生成失败。请在代码中创建选项。
通常,如果您指定了不受支持的选项,在代码生成过程中会以静默方式忽略该选项。但是,如果使用圆点表示法指定绘图函数或输出函数,代码生成可能引发错误。为确保可靠性,请仅指定支持的选项。
由于不支持输出函数和绘图函数,求解器不会返回退出标志 –1。
有关示例,请参阅为 lsqcurvefit 或 lsqnonlin 生成代码。
要并行运行,请将 'UseParallel'
选项设置为 true
。
options = optimoptions('
solvername
','UseParallel',true)
有关详细信息,请参阅在 Optimization Toolbox 中使用并行计算。
版本历史记录
在 R2006a 之前推出JacobianMultiplyFcn
选项的语法是
W = jmfun(Jinfo, Y, flag)
MATLAB 传递给函数 jmfun
的 Jinfo
数据现在可以是任何数据类型。例如,现在 Jinfo
可以采用结构体类型。在以前的版本中,Jinfo
必须为标准的双精度数组。
Jinfo
数据是目标函数的第二个输出:
[F,Jinfo] = myfun(x)
以后的版本中将会删除 CheckGradients
选项。要检查目标函数或非线性约束函数的一阶导数,请使用 checkGradients
函数。
lsqnonlin
支持线性和非线性约束。为了满足约束,求解器使用 fmincon
中的 "interior-point"
算法。
如果您指定了约束但未指定算法,则求解器会自动切换到
"interior-point"
算法。如果指定了约束和算法,则必须指定
"interior-point"
算法。
有关算法的详细信息,请参阅针对约束最小二乘修正的 fmincon 算法。有关示例,请参阅比较 lsqnonlin 和 fmincon 的约束非线性最小二乘法。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)