定义包含非线性方程组的函数,然后循环利用fsolve函数求解非线性方程组,目的是利用三个已知点确定原点坐标

数学模型如前一篇所述,不再累述!

主程序如下:

global XA YA ZA XB YB ZB XC YC ZC %定义全局变量
A=100*(rand(15,9)*2-1);% 设定15组能够确定坐标原点的三个点,每一行代表一个组,每组各元素含义如下:
% XA YA ZA XB YB ZB XC YC ZC
P=zeros(15,3);% 预设内存给被测基准块原点在测量系中的坐标
for i=1:length(A)
XA=A(i,1); YA=A(i,2);ZA=A(i,3);XB=A(i,4);YB=A(i,5);ZB=A(i,6);XC=A(i,7);YC=A(i,8);ZC=A(i,9);%方程组参数赋值
fun=@myfun_2;
x0=[0;0;192];% 设定初值
opt=optimset('Display','off');%不显示输出
x=fsolve(fun,x0,opt); %调用函数
P(i,1)=x(1);%原点X向坐标赋值
P(i,2)=x(2);%原点Y向坐标赋值
P(i,3)=x(3);%原点Z向坐标赋值
end

子程序如下:

function f=myfun_2(x)
global XA YA ZA XB YB ZB XC YC ZC %定义全局变量
f1=(norm([XA-x(1);YA-x(2);ZA-x(3)]))^2+(norm([XB-x(1);YB-x(2);ZB-x(3)]))^2-(norm([XA-XB;YA-YB;ZA-ZB]))^2;
%勾股定理,原点与其中两点构成直角三角形
f2=(norm([XB-x(1);YB-x(2);ZB-x(3)]))^2+(norm([XC-x(1);YC-x(2);ZC-x(3)]))^2-(norm([XB-XC;YB-YC;ZB-ZC]))^2;
%勾股定理,原点与其中两点构成直角三角形
f3=norm([XA-x(1);YA-x(2);ZA-x(3)])+norm([XC-x(1);YC-x(2);ZC-x(3)])-norm([XA-XC;YA-YC;ZA-ZC]);
%三点一线时,中间一点与两端点距离和等于两端点之间距离
f=[f1;f2;f3];
end

计算结果如下:

P =

   54.5300  -31.1383   11.6357
  -31.7055   46.5079  -48.9986
   -2.1757  -74.7235   97.1213
  -29.0877  -41.2299  -44.4098
  -66.0507  -30.5754   23.5628
   -5.5375  -13.3490  -92.2326
  -76.5056    1.6898   38.0064
  -81.3499  -47.0950   51.0419
   17.2971  -49.4453  -38.6870
   17.4006  -58.4037  -63.9911
  -38.8896   53.2870   94.6090
    2.2439   -3.2118    9.4896
   -4.3917   29.4629  -82.0220
   78.9970   -3.6448   19.9034
  -23.0974   53.4943  -44.2488

该方法更直观,更容易理解!

你可能感兴趣的:(for循环,fsolve函数,空间解析几何,非线性方程组,fsolve函数,三点坐标系,for循环,全局变量)