【问题标题】:polyfit and polyval funtions [duplicate]polyfit 和 polyval 函数
【发布时间】:2019-12-10 05:36:04
【问题描述】:

您好,我的问题是关于 P3(x) 的曲线调整,我使用 polyfit 和 polyval 函数编写代码,但我需要在不使用这些函数的情况下编写代码。

这是我写的代码

n=input('Enter a value: ');
if(n<3)
    fprintf('Enter a different value larger than 3')
end 
if(n>=3)
x = 1:n; 
y = -0.3*x + 2*randn(1,n); 
[p,S] = polyfit(x,y,3);
[y_fit,delta] = polyval(p,x,S);
plot(x,y,'bo')
hold on
plot(x,y_fit,'r-')
title('Linear-Fit Output')
legend('Data','Linear Fit')
end

这是我编写的代码,它正在运行,但我想在不使用 polfite 和 polyval 函数的情况下编写它

【问题讨论】:

  • 这是学校作业吗?
  • 是的,先生。这是我的作业,讲师今天说的不允许我们使用这些功能,但截止日期是明天
  • 我在问题中添加了我的工作,我仍在尝试实施它。
  • 请查阅上面的副本 - 只需将 degree 变量更改为 3 而不是 8,如帖子中所示。它还具有不使用符号数学工具箱的优点。也相关:math.stackexchange.com/questions/1070670/…

标签: matlab curve-fitting


【解决方案1】:

不使用syms

y = a0*x^0 + a1*x^1 + a2*x^2 + a3*x^3
For n data point --> y = X*a 

在哪里

X = [x1^0 , a1*x1^1, a2*x1^2 , a3*x1^3; x2^0 , a1*x2^1, a2*x2^2 , a3*x2^3;...;xn^0 , a1*xn^1 , a2*xn^2 , a3*xn^3 ]

a = [a0, a1, a2, a3]; y = [y1, y2, ..., yn] a 计算如下

y = X*a ---> a = X\y

代码如下

n is given 
x = 1:n; 
y = -0.3*x + 2*randn(1,n);
x0 = ones(n, 1);
x1 = x';
x2 = (x.^2)';
x3 = (x.^3)';
X = [x0 x1 x2 x3];
a = X\(y');
f =@(t)a(1) + a(2).*t + a(3).*(t.^2)+ a(4).*(t.^3);

使用最小二乘法寻找最佳拟合三次多项式

n=input('Enter a value: ');
if(n<3)
    fprintf('Enter a different value larger than 3')
else
    x = 1:n; 
    y = -0.3*x + 2*randn(1,n);
    % Cubic regression

    syms a0 a1 a2 a3

    yq = a0 + a1.*x + a2.*(x.^2) + a3.*(x.^3) ;
    rq = yq - y;
    f = sum(rq.^2);
    fa0 = diff(f,a0);
    fa1 = diff(f,a1);
    fa2 = diff(f,a2);
    fa3 = diff(f,a3);
    sol = solve(fa0 == 0, fa1 == 0, fa2 == 0, a0, a1, a2, a3);
    a0 = sol.a0;
    a1 = sol.a1;
    a2 = sol.a2;
    a3 = sol.a3;

    % Cubic Regression  Curve Function

    f =@(t)a0 + a1.*t + a2.*(t.^2)+ a3.*(t.^3);

    % Plot Data and Cubic Regression Curve
    h = figure(1);
    % Data
    plot3 = scatter(x, y, 100, '+', 'MarkerEdgeColor', 'red', 'linewidth', 5);
    hold on
    % cubic Regression Curve
    xx = linspace(0,n,100);
    plot4 = plot(xx, f(xx), 'linewidth', 5);
    [~,b] = legend([plot3 plot4],{'Real Data','Cubic Regression'}, 'FontSize',30);
    set(findobj(b,'-property','MarkerSize'),'MarkerSize',30);

    xlabel('x-axis','color', 'k', 'fontSize', 25)
    ylabel('y-axis', 'color','k', 'fontSize', 25)
    hYLabel = get(gca,'YLabel');
    set(hYLabel,'rotation',0,'VerticalAlignment','middle',  'HorizontalAlignment','right')
    grid on
    grid minor
    set(gca,'FontSize',20)
    set(get(h,'CurrentAxes'),'GridAlpha',0.8,'MinorGridAlpha',0.5);
    xticks(x);
    title('Cubic Regression', 'color', 'r');
    whitebg('w');
end

n = 5


n = 20


【讨论】:

  • 您能否提出一个使用符号数学工具箱的解决方案?
  • 我在上面添加了不使用 sym 的方法。
  • 这很糟糕:a = inv(transpose(X)*X)*transpose(X)*y 你在重新发明轮子,甚至没有做对。 Matlab 有一个伪逆函数pinv,它正确地使用了共轭转置。但是你甚至不需要那个,因为左除就足够了。 A = X \ y 它比计算逆运算更快,并且在面对退化输入时做一些更明智的事情。
  • @BenVoigt 这只是一个伪代码,用于显示计算 a 所需的数据。在代码格式中检查正下方,我写了a = ((X')*X)((X')*(y'));
  • 这是正确的共轭转置,但仍然不如a = X \ y' 有效或健壮
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 2011-10-22
  • 1970-01-01
  • 2021-04-09
相关资源
最近更新 更多