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]表示纵坐标,然后循环计算公式集。
最后更新于 2023-10-11 07:37:38 并被添加「」标签,已有 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
相关文章