主要内容

非线性数据拟合

这个例子展示了如何使用几个数据适合非线性函数优化工具箱™算法。

问题的设置

考虑以下数据:

Data =(0.0000 5.8955 0.1000 3.5639 0.2000 2.5173 0.3000 1.9790 0.4000 1.8990 0.5000 1.3938 0.6000 1.1359 0.7000 1.0096 0.8000 1.0343 0.9000 0.8435 1.0000 0.6856 1.1000 0.6100 1.2000 0.5392 1.3000 0.3946 1.4000 0.3903 1.5000 0.5474 1.6000 0.3459 1.7000 0.1370 1.8000 0.2211 1.9000 0.1704 2.0000 0.2636);

让我们绘制这些数据点。

t =数据(:1);y =数据(:,2);%轴([0 2 -0.5 6)%抓住情节(t y“罗”)标题(的数据点)

图包含一个坐标轴对象。坐标轴对象与标题数据点包含一个类型的对象。

%推迟

我们想适应函数

y = c (1) * exp (lam (1) * t) + c (2) * exp (lam (2) * t)

的数据。

解决方案方法使用lsqcurvefit

lsqcurvefit函数很容易解决这种类型的问题。

首先,定义参数的一个变量x:

x (1) = c (1)

x (2) = lam (1)

x (3) = c (2)

林x (4) = (2)

然后定义曲线的函数的参数x和t的数据:

F = @ (x, xdata) x (1) * exp (- x (2) * xdata) + x (3) * exp (- x (4) * xdata);

我们任意设置起始点x0如下:c(1) = 1,林(1)= 1,c(2) = 1,林(2)= 0:

x0 = [1 1 1 0];

我们运行的解算器和情节产生的健康。

[x, resnorm ~, exitflag,输出]= lsqcurvefit (F, x0、t、y)
局部最小值。lsqcurvefit停止是因为最后的平方和的变化相对于其初始值小于公差的值函数。
x =1×43.0068 10.5869 2.8891 1.4003
resnorm = 0.1477
exitflag = 3
输出=结构体字段:firstorderopt: 7.8830 e-06迭代:6 funcCount: 35 cgiterations: 0算法:“trust-region-reflective”stepsize: 0.0096消息:“局部最小值可能....”
持有情节(t, F (x, t))

图包含一个坐标轴对象。坐标轴对象与标题数据点包含2线类型的对象。

解决方案方法使用fminunc

来解决这个问题fminunc,我们设置了目标函数残差的平方和。

Fsumsquares = @ (x)和((F (x, t) - y)。^ 2);选择= optimoptions (“fminunc”,“算法”,“拟牛顿”);[xunc, ressquared eflag outputu] =fminunc (x0, Fsumsquares选择)
局部最小值。优化完成因为梯度的大小小于最优值的宽容。
xunc =1×42.8890 1.4003 3.0069 10.5862
ressquared = 0.1477
eflag = 1
outputu =结构体字段:迭代:30 funcCount: 185 stepsize: 0.0017 lssteplength: 1 firstorderopt: 2.9662 e-05算法:“拟牛顿”的信息:“局部最小值发现....”

请注意,fminunc发现相同的解决方案lsqcurvefit,但更多的功能评估。的参数fminunc以相反的顺序是那些lsqcurvefit;大榄林(2),不是林(1)。这并不奇怪,变量的顺序是任意的。

流([“有% d迭代使用fminunc”,”和使用lsqcurvefit % d。\ n”),outputu.iterations output.iterations)
有使用fminunc 30迭代,并使用lsqcurvefit 6。
流([“有% d函数使用fminunc评估,”“使用lsqcurvefit和% d。”),outputu.funcCount output.funcCount)
有185使用fminunc功能评价,并使用lsqcurvefit 35。

把线性和非线性问题

注意,拟合问题是线性参数c(1)和c (2)。这意味着任何值的林兰姆(1)和(2),我们可以使用反斜杠符的值c(1)和c(2)解决最小二乘问题。

我们现在返工问题是一个二维问题,寻找最好的价值观林兰姆(1)和(2)。的值c(1)和c(2)计算每一步使用反斜杠符如上所述。

类型fitvector
函数是= fitvector (lam xdata, ydata) % fitvector DATDEMO用来拟合函数的返回值。%是= FITVECTOR (lam xdata)返回的值拟合函数,y %(下面定义),在数据点xdata参数设置为林。%是返回N×1列向量,其中N是%数据点的数量。% % FITVECTOR假设拟合函数,y, y的% % = c (1) * exp (lam (1) * t) +…+ c (n) * exp (lam (n) * t) % % n线性参数c和n非线性参数。% %求解线性参数c,我们构建一个矩阵a %的j列在哪里exp (lam (j) * xdata) (xdata是一个向量)。%然后我们解决线性最小二乘解的* c = ydata c %, ydata y。的观测值= 0(长度(xdata), (lam));%建立一个矩阵j = 1:长度(lam) (:, j) = exp (lam (j) * xdata);c = \ ydata结束;%解决* c = y为线性参数c是= * c; % return the estimated response based on c

解决问题用lsqcurvefit,从一个二维初始点林(1),林(2):

0 x02 = [1];F2 = @ (x, t) fitvector (x, t, y);(x2, resnorm2, ~, exitflag2 output2] = lsqcurvefit (F2, x02 t y)
局部最小值。lsqcurvefit停止是因为最后的平方和的变化相对于其初始值小于公差的值函数。
x2 =1×210.5861 - 1.4003
resnorm2 = 0.1477
exitflag2 = 3
output2 =结构体字段:firstorderopt: 4.4087 e-06迭代:10 funcCount: 33 cgiterations: 0算法:“trust-region-reflective”stepsize: 0.0080消息:“局部最小值可能....”

二维的效率解决方案类似于四维的解决方案:

流([“有% d函数评估使用二维的的配方,使用4 - d % d配方。”),output2.funcCount output.funcCount)
有33个函数评估使用二维配方,使用4 - d配方和35。

分割问题是更健壮的初始猜测

选择一个糟糕的起点最初的四个参数问题导致当地的解决方案,并不是全球性的。选择一个起点相同的坏lam兰姆(1)和(2)分成两个参数的值问题导致了全球性的解决方案。给我们重新运行原始问题的起点会导致相对糟糕的局部解,并比较结果符合全球解决方案。

x0bad = (1 1 0 5);[xbad, resnormbad, ~, exitflagbad outputbad] =lsqcurvefit (F, x0bad t y)
局部最小值。lsqcurvefit停止是因为最后的平方和的变化相对于其初始值小于公差的值函数。
xbad =1×4-22.9036 2.4792 28.0273 2.4791
resnormbad = 2.2173
exitflagbad = 3
outputbad =结构体字段:firstorderopt: 0.0056迭代:32 funcCount: 165 cgiterations: 0算法:“trust-region-reflective”stepsize: 0.0021消息:“局部最小值可能....”
持有情节(t、F (xbad t),‘g’)传说(“数据”,“全球健康”,“坏当地合适的,“位置”,“不”)举行

图包含一个坐标轴对象。坐标轴对象与标题数据点包含3线类型的对象。这些对象表示数据,全球健康,坏的地方。

流([的残余规范良好的终点是% f,”和坏的残留标准终点% f。),resnorm resnormbad)
好的终点的残留标准是0.147723,和残余规范坏终点是2.217300。

相关的话题