C语言中用最小二乘法拟合平面

# includestdio.h

#包含math.h

void gauss(int n,float Array最小二乘法)平面方程拟合计算专家给出详细的计算方法。 解决方案:

有n个数据点Pi(,yi,zi)。

假设平面方程为:a*x b*y c*z d=0,其中a,b,c,d为待定系数,a,b,c不能同时为0。

显然,a*x b*y c*z d=0并且

k*a*x k*b*y k*c*z k*d=0(k≠0)

代表同一个平面。所以,如果d不为0,那么方程两边除以d,常数项就可以变成1;但是当d=0时,情况就有点复杂了。

现在我来解释一下大意。为了讨论方便,一开始我不会假设d=1或0。

设拟合平面的方程为∏: a * x b * y c * z d = 0。

从数据点Pi到平面a*x b*y c*z d=0的距离被设置为di,

那么di 2 = (a * xib * yic * zid) 2/(a 2b 2c 2),

设L = ∑ di 2 (I = 1,...,n)是目标函数,现在我们要最小化l。

l可以看作是(a,b,c,d)的一个函数(,yi,zi)都是已知的),

l取最小值的一个必要(非充分)条件是:

∂L/∂a=0、∂L/∂b=0、∂L/∂c=0、∂L/∂d=0、

∂l/∂a=∑2*xi*(a*xi b *易c *子d)/(a^2 b^2 c^2) (i=1,...,n)

=A1*a B1*b C1*c D1*d,

其中,

A1=2/(a^2 b^2 c^2)*(∑xi^2)(i=1,...n),

B1=2/(a^2 b^2 c^2)*(∑xi*yi)(i=1,...n),

C1=2/(a^2 b^2 c^2)*(∑xi*zi)(i=1,...n),

D1=2/(a^2 b^2 c^2)*(∑xi)(i=1,...n),

同样的,

∂L/∂b=A2*a B2*b C2*c D2*d,

∂L/∂c=A3*a B3*b C3*c D3*d,

其中,

A2=2/(a^2 b^2 c^2)*(∑yi*xi)(i=1,...n),

B2=2/(a^2 b^2 c^2)*(∑yi^2)(i=1,...n),

C2=2/(a^2 b^2 c^2)*(∑yi*zi)(i=1,...n),

D2=2/(a^2 b^2 c^2)*(∑yi)(i=1,...n),

A3=2/(a^2 b^2 c^2)*(∑zi*xi)(i=1,...n),

B3=2/(a^2 b^2 c^2)*(∑zi*yi)(i=1,...n),

C3=2/(a^2 b^2 c^2)*(∑zi^2)(i=1,...n),

D3=2/(a^2 b^2 c^2)*(∑zi)(i=1,...n),

∂l/∂d=∑2*(a*xi b *易c *子d)/(a^2 b^2 c^2) (i=1,...,n)

=D1*a D2*b D3*c D4*d,

其中D4 = 2n/(a 2b 2c 2)。

所以有方程式:

A1*a B1*b C1*c D1*d=0,

A2*a B2*b C2*c D2*d=0,

A3*a B3*b C3*c D3*d=0,

D1*a D2*b D3*c D4*d=0,

只要解这个方程组。具体如何求解,可以参考书中的计算方法,里面有详细的解释。

用数值法解线性方程组最好不要用行列式。

以下网站上有一个介绍文档

第一步有遗漏,后面还是用行列式计算,不太好。

用C语言编程最小二乘法的线性拟合 首先你需要知道最小二乘法的公式,然后用数组实现。比如定义数组double x[10]表示十个横坐标,double y[10]表示纵坐标,然后循环计算公式集。

相关文章

发表新评论