【问题标题】:nlinfit Matlab function equivalent function c codenlinfit Matlab函数等效函数c代码
【发布时间】:2012-12-28 14:19:04
【问题描述】:

我的曲线拟合有问题,我必须使用这个方程拟合一组点(x 和 y) a + bx ^ 2.5 + cx ^ 3.5。我已经尝试使用nlinfit函数从matlab曲线拟合工具箱中获取它。现在我想将其转换为c/c ++。有什么方法可以从matlab转换它,否则就在那里在 c/c++ 中执行的任何库。

x = [0 90 180 270]';
y = [201 173 118 146]';
modelfun = @(b,x)(b(1)+ b(2).*x.^2.5+ b(3).*x.^3);
opts = statset('nlinfit');
beta0 = [0;0;0];
beta = nlinfit(x,y,modelfun,beta0,opts);
disp(beta);
 b = beta;
y1 = b(1)+ b(2).*x.^2.5 + b(3).*x.^3;
disp(y1);

提前致谢。

【问题讨论】:

  • 为什么在这种情况下使用nlinfit?为什么不使用最小二乘法?制作一个矩阵X = [ones(numel(x),1) x(:).^2.5 x(:).^3],然后你将拥有b = X \ y
  • visual c++ 非常有用...
  • 嗨 Shai...我不是这方面的专家...你能解释一下我如何在 c/c++ 中轻松做到这一点...
  • Shai....我明白了..非常感谢...
  • @aranga - 如果你有解决方案 - 继续发布它作为后代的答案!

标签: c matlab visual-c++ curve-fitting data-fitting


【解决方案1】:

最后我得到了这个 nlinfit 的非常简单的答案...... Matlab代码是

modelfun = @(b,x)(b(1)+ b(2).*x.^2.5+ b(3).*x.^3);
opts = statset('nlinfit');
beta0 = [0;0;0];
beta = nlinfit(x,y,modelfun,beta0,opts);
% % % disp(beta);
b = beta;
y1 = b(1)+ b(2).*x.^2.5 + b(3).*x.^3;
% disp(y1);

这个推导创建了等效函数

Ax = B;
%multiply with A' Then 
(A'*A)*x=(A'*b)
% x=(A'*A)/(A'*b)% similar to inv(A'*A)*(A'*b)
coeff1 = inv(A'*A)*(A'*B);
disp(coeff1);

使用这些系数,我们很容易使用上述方程找到 Y 的值。 感谢shai....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    相关资源
    最近更新 更多