可以做到!!关于参数问题 help之
我一般喜欢使用nlinfit
非线性拟合,我用过很多次发现要用好她
的关键在于你要找到一个很好的初值
举个例子:
椭圆的方程可以是
ax^2+by^2+cxy+dx+ey+f=0;
发现其实双曲线,抛物线和他的一样
所以你在选取初值的时候最起码初值带入后
是个椭圆,
不然你拟合出来不仅仅是效果差,可能就变质
你说的情况其实是解方程了(四个未知数四个方程)
对于更多的数据:
先编写函数
function f=ffun(a,x)
f=a(1)x(:,1)+a(2)x(:,1)^2+a(3)x(:,2)+a(4)x(:,2)^2;
其余运行
x=[p,c];%p,c为列响量,f也为列向量
a0=[1,1,1,1];%初值取好点效果更好
a=nlinfit(x,f,'ffun',a0)
定点(2,3)半径203,又边要超出边界003,画面调整成为高度(3-203),宽2,最右下角的点就是圆的一边顶点,再画面调整为高3,宽2,这个点是圆心,然后调整画面为高3宽(2+203),这个时候最右下角的点是圆的右面顶点,现在圆心定啦,上顶点和右顶点也定啦,知道这3个点就能画出你想要的圆
function my_fit()
% 二维非线性拟合
% 直接将该代码复制到 m文件运行就可以了
% 请仔细看注释,注释写的很清楚
% step0:生成用于拟合的数据
%(以椭球为例,仅为测试,如果有现成数据,请替换此步中 x,y,z 值)
a = 3; %% 方程:x^2/a^2 + y^2/b^2 + z^2/c^2 = 1
b = 4; %% 从而,z = csqrt(1 - x^2/a^2 - y^2/b^2)
c = 5; %% 用上半球数据作为待拟合数据
x = -a:01:a; %% x,y取值范围
y = -b:01:b;
[X, Y] = meshgrid(x,y); %% 生成一个二维的取值范围
[M, N] = size(X);
x = reshape(X, MN, 1); %% 把矩阵转化为向量
y = reshape(Y, MN, 1);
p = ((1 - x^2/a^2 - y^2/b^2) >= 0); %% 将大于等于0的数值取出(只有这部分才有意义)
x = x(p); %% 生成的值均在上椭球面,如果有现成数据,请将 step0去掉
y = y(p); %% 并直接给 x,y,z赋值
z = csqrt(1 - x^2/a^2 - y^2/b^2);
% step1:开始拟合,k表示拟合系数,行向量
% 待拟合方程:F = z^2 = c^2 - c^2x^2/a^2 - c^2y^2/b^2
% x,y,z 均要先转化为列向量!!!
% 先把 z 值平方,再进行拟合,很重要!!!
% 令 c^2 = k(1),c^2/a^2 = k(2), c^2y^2/b^2 = k(3)
% 求出 k 即得到椭球方程
xdata = [x,y]; %% 将 x,y 数据按列组合到 xdata
ydata = z^2; %% 先把 z 值平方,再进行拟合
k0 = [1 1 1]; %% k 的运行初值,不会影响最终结果
F = @(k,xdata)k(1) - k(2)xdata(:,1)^2 -k(3)xdata(:,2)^2; %% 这句话是拟合函数
[k,resnorm]=lsqcurvefit(F,k0,xdata,ydata); %% 这句话是拟合关键!!!
% step2:椭圆参数求解
% 根据c^2 = k(1),c^2/a^2 = k(2), c^2y^2/b^2 = k(3)
c = sqrt(k(1));
a = c/sqrt(k(2));
b = c/sqrt(k(3));
disp('a轴:');
disp(a);
disp('b轴:');
disp(b);
disp('c轴:');
disp(c);
end
用plot()函数,就可以将拟合多条曲线绘制在一个坐标系中。
实施过程为
plot(x1,y1,x2,y2,x3,y3,)
其中:x1,y1为拟合曲线1某个区间的若干个(x1(i),y1(i))点的行(列)向量
x2,y2为拟合曲线2某个区间的若干个(x2(i),y2(i))点的行(列)向量
x3,y3为拟合曲线3某个区间的若干个(x3(i),y3(i))点的行(列)向量
以上就是关于如何用matlab进行多元曲线拟合全部的内容,包括:如何用matlab进行多元曲线拟合、matlab 离散点拟合,拟合成圆,并能确定圆心坐标和半径对应的长度、用matlab咋三维坐标系内拟合椭球公式等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)