如何在Matlab中使用非线性最小二乘法求解一组超定方程

时间:2014-06-24 09:09:58

标签: matlab least-squares nonlinear-optimization

A11 = cos(x)*cos(y)                           (1)
A12 = cos(x)*sin(y)                           (2)
A13 = -sin(y)                                 (3)
A21 = sin(z)*sin(x)*cos(y) - cos(z)*sin(y)    (4)
A22 = sin(z)*sin(y)*sin(x) + cos(z)*cos(y)    (5)
A23 = cos(x)*sin(z)                           (6)
A31 = cos(z)*sin(x)*cos(z) + sin(z)*sin(x)    (7)
A32 = cos(z)*sin(x)*sin(y) - sin(z)*cos(y)    (8)
A33 = cos(x)*cos(z)                           (9)

我有一组九个方程式,只有三个未知数。未知数是x,y和z。我知道A11,A12,A13 ....... A33的价值。但是这些值可能会有一些噪音,因此我将不得不使用一些优化算法来找到x,y和z的最佳拟合值。

如何在Matlab中求解上述超定方程组?

我一直在线搜索,我发现了一些功能,尤其是one

但我对于解决问题的最佳方法感到非常困惑。需要一点方向......

1 个答案:

答案 0 :(得分:1)

我最喜欢的是优化工具箱中的lsqcurvefit

documentation您看到它需要:

  • 功能句柄(有趣)
  • 参数的起始值(x0)
  • 在您的情况下不存在的其他非拟合参数(xdata)
  • 数据值(ydata)

可以设置选项optimset,您可以在其中指定几种经过良好测试的算法之一。此外,可以在那里设置最大迭代次数或功能容差或参数值容差的最小阈值。


如果您不应该使用优化工具箱,则可以始终使用fminsearch并最小化最小方块sum((ydata-fun(x)).^2)


在这里的案例中编写函数fun(也参见文档)并使用问题中的代码的示例如下:

function r = fun(p, xdata)
x = p(1);
y = p(2);
z = p(3);

% code from here
A11 = cos(x)*cos(y)
A12 = cos(x)*sin(y)
A13 = -sin(y)
A21 = sin(z)*sin(x)*cos(y) - cos(z)*sin(y)
A22 = sin(z)*sin(y)*sin(x) + cos(z)*cos(y)
A23 = cos(x)*sin(z)
A31 = cos(z)*sin(x)*cos(z) + sin(z)*sin(x)
A32 = cos(z)*sin(x)*sin(y) - sin(z)*cos(y)
A33 = cos(x)*cos(z)

% everything in one matrix
r = [A11, A12, A13, A21, A22, A23, A31, A32, A33];
end

人们看到标量和矢量值函数之间没有真正的区别。 Matlab自动计算数据的差异并对其求和。