% 设置用中等模式(memdium-scale)算法 >> options=optimset('Largescale','off'); % 通过调用LSQNONLIN重现计算新的系数 >> x=lsqnonlin(@fit_simp,X0,[],[],options,X,Y); % 调用LSQNONLIN结果输出表明拟合是成功的 Optimization terminated successfully: Gradient in the search direction less than tolFun Gradient less than 10*(tolFun+tolX) % 绘制原始数据与新的计算的数据
>> Y_new=x(1)+x(2).*exp(x(3).*X)+x(4).*exp(x(5).*X); >> plot(X,Y,'+r',X,Y_new,'b');
※注意:LSQNONLIN 只可以处理实数变量。在处理包括复数变量的实例的拟合的时候,数据集应该被切分成实数与虚数部分。下面给出一个例子演示如何对复数参数进行最小二乘拟合。
为了拟合复数变量,你需要将复数分解为实数部分与虚数部分,然后把他们传递到函数中去,这个函数被LEASTSQ作为单个输入调用。首先,将复数分解为实部与虚部两个向量。其次,
将这两个向量理解成诸如第一部分是实部、第二部分是虚部。在MATLAB函数中,重新装配复数数据,并用你想拟合的复数方程计算。将输出向量分解实部与虚部,将这两部分连接为一个单一的输出向量传递回LEASTSQ。下面,给出一个例子演示如何根据两个复数指数拟合实数X与Y。 建立方程:
function zero = fit2(x,X,Y) % 根据输入x重建复数输入 cmpx = x(1:4)+i.*x(5:8); % 利用复数计算函数
zerocomp = cmpx(1).*exp(cmpx(2).*X) + cmpx(3).* exp(cmpx(4).*X)-Y; % 将结果转换成一个列向量
% 其中第一部分是实部,第二部分是虚部 numx = length(X); % 实部长度 zero=real(zerocomp); %实部
zero(numx+1:2*numx)=imag(zerocomp); % 虚部
为了评价计算这个函数,需要X与Y数据集。LSQNONLIN将根据它拟合出下面方程中的参数a,b,c与d:
Y = a*exp(b*X)+c*exp(d*X); 其中,a,b,c与d是复数变量。 >> X=0:.1:5; >> Y=sin(X);
>> Y=Y+.1*rand(size(Y))-.05; >> cmpx0=[1 i 2 2*i]; >> x0(1:4)=real(cmpx0); >> x0(5:8)=imag(cmpx0); >> x=leastsq(@fit2,x0,[],[],X,Y); >> cmpx=x(1:4)+i.*x(5:8);
>> Y1=real(cmpx(1).*exp(cmpx(2).*X)+cmpx(3).*exp(cmpx(4).*X)); >> plot(X,Y1,'r'); >> hold on
>> plot(X,Y,'+');
二。LSQCURVEFIT:利用此函数可以在最小二乘意义上解决非线性曲线拟合(数据拟合)问题。也就是说,给定输入数据xdata,以及观测的输出数据ydata,找到系数x,使得函数F(x,xdata)能够最好的拟合向量值。LSQCURVEFIT利用与LSQNONLIN相同的算法。它的目的在于专门为数据拟合问题提供一个接口。
在拟合的时候,2维、3维或者N维参数拟合是没有什么差别的。下面给出一个3维参数拟合的例子。待拟合函数是: z = a1*y.*x..^2+a2*sin(x)+a3*y.^3; 建立的myfun.m的函数如下: function F = myfun(a, data); x = data(1,:); y = data(2,:);
F= a(1)*y.*x.^2+a(2)*sin(x)+a(3)*y.^3; 下面的脚本展示了这么利用上面的函数: >> xdata= [3.6 7.7 9.3 4.1 8.6 2.8 1.3 7.9 10.0 5.4];
>> ydata= [16.5 150.6 263.1 24.7 208.5 9.9 2.7 163.9 325.0 54.3];
>> zdata= [95.09 23.11 60.63 48.59 89.12 76.97 45.68 1.84 82.17 44.47]; >> data=[xdata; ydata];
>> a0= [10, 10, 10]; % 初识揣测
>> [a, resnorm] = lsqcurvefit(@myfun,a0,data,zdata) Maximum number of function evaluations exceeded; increase options.MaxFunEvals a = 0.0088 -34.2886 -0.0000 resnorm = 2.2636e+004 >> format long >> a
a = 0.00881645527493 -34.28862491919983 -0.00000655131499 >> option=optimset('MaxFunEvals',800);
>> [a, resnorm] = lsqcurvefit(@myfun,a0, data, zdata, [], [], option) Optimization terminated successfully:
Relative function value changing by less than OPTIONS.TolFun a = 0.00740965259653 -20.21201417111138 -0.00000502014964 resnorm = 2.195886958305428e+004
统计工具箱函数 函数名 描述
nlinfit(非线性回归) 采用Gauss-Newton法进行非线性最小二乘数据拟合 lscov(线性回归) 根据已知协方差矩阵进行最小二乘估计 regress 多元线性回归 regstats 回归诊断
ridge 脊回归(?Ridge regress) rstool 多维响应表面可视化(RSV) stepwise 交互式逐步回归 具体例子请参阅相应文档
==========================================================
在Matlab中如果求解一个二元二次方程,现在只有两个方程可以用solve求解出所有的解。但是当存在多余2个方程的时候(即为超定方程组时),该如何求解呢??还能用Solve函数吗?
比如下面的方程:
a1*x^2+b1*x+c1*y^2+d1*y=e1 a2*x^2+b2*x+c2*y^2+d2*y=e2 a3+b3*x+c3*y=e3
x,y为未知数,其他的为已知数,求解x,y. ----------------------
用fmin求e1^2+e2^2+e3^2的最小解 -------------------------
你的意思是将方程转换成: a1*x^2+b1*x+c1*y^2+d1*y-e1=f1 a2*x^2+b2*x+c2*y^2+d2*y-e2=f2 a3+b3*x+c3*y-e3=f3
再用fminsearch求解最小值min(f1+f2+f3),得到最终的未知数的值是不是?? 很有道理。
但是这个fminsearch是需要初始解才能得到最终的解的。假如不知道初始解该如何求解呢??
-----------------------------
1. fminsearch求解最小值min(f1^2+f2^2+f3^2)
2.一般非线性问题的数值解往往都是迭代法,因而需要初值
3.初值可以试出来或者对原始方程作简化然后定性分析出一个解的大体范围来确定初值。
4.非线性问题很少有一劳永逸的一统天下的解法 5.正因为如此,才让我们有事做,有饭吃
========================================================