【问题标题】:Parabola plot with data in Octave八度数据的抛物线图
【发布时间】:2014-02-04 23:38:41
【问题描述】:

我一直在尝试将抛物线拟合到 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')

然后我得到这条完全错误的抛物线。完全不符合数据!谁能告诉我代码有什么问题?

My parabola

【问题讨论】:

    标签: matlab plot filter octave


    【解决方案1】:

    嗯,我认为主要问题是您的计算中有一些错误。我认为您应该使用抛物线上的三个点来获得线性方程组。无需像使用

    那样计算函数的导数

    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');
    

    【讨论】:

      猜你喜欢
      • 2019-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多