我一直试图将抛物线拟合到y为正的数据部分。我被告知,P1(x1,y1)
是第一个数据点,Pg(xg,yg)
是最后一个,而最高点是x=(x1+xg)/2.
我写了以下内容:
x=data(:,1);
y=data(:,2);
filter=y>0;
xp=x(filter);
yp=y(filter);
P1=[xp(1) yp(1)];
Pg=[xp(end) yp(end)];
xT=(xp(1)+xp(end))/2;
A=[1 xp(1) power(xp(1),2) %as the equation is y = a0 + x*a1 + x^2 * a2
1 xp(end) power(xp(end),2)
0 1 2*xT]; % as the top point satisfies dy/dx = a1 + 2*x*a2 = 0
b=[yg(1) yg(end) 0]'; %'
p=A\b;
x_fit=[xp(1):0.1:xp(end)];
y_fit=power(x_fit,2).*p(3)+x_fit.*p(2)+p(1);
figure
plot(xp,yp,'*')
hold on
plot(x_fit,y_fit,'r')
然后我得到这个完全错误的抛物线。它根本不适合数据!有人可以告诉我代码有什么问题吗?
答案 0 :(得分:0)
嗯,我认为主要问题是你的计算中有些错误。我认为你应该在抛物线上使用三个点来获得一个线性方程组。无需像使用
那样计算函数的导数dy / dx = a1 + 2 * x * a2 = 0
您可以在散点图中选择另一个点,而不是导数上的点,例如最大值:PT = [xp_max yp_max];并将其用于矩阵A和b。
等式dy / dx = a1 + 2 * x * a2 = 0不符合线性方程组的基本方案:a0 + a1 * x + a2 * x ^ 2 = y;
顺便说一句:如果您不必以这种方式计算抛物线,您可以查看Matlab / Octave函数polyfit(),它可以计算出问题的最小二乘解。这将导致一个简单的实现:
p = polyfit(x, y, 2);
y2 = polyval(p, x);
figure(); plot(x, y, '*'); hold on;
plot(x, y2, 'or');