三个固定点坐标已知A(X1,Y1),B(X2,Y2),C(X3,Y3)。未知点(X,Y)。未知点到A/B距离差为det_ab,到B/C距离差为det_bc,到A/C距离差为det_ac;
求解未知点坐标?
想写成一个函数,输入参数是A/B/C坐标和三个距离差。输出为未知点的坐标。
求写出matlab代码~
另外,假如我这三个距离差有一定的误差,那么求解的时候怎样得到最优解呢?
由于方程个数3>未知数个数2,且涉及到距离的计算,所以原问题是求解一个超定(非线性)方程组.平方和形式这里采用最小二乘法解决(n个定点与未知点的计算,n>=2):
先建立pfun.m文件:
%给出待求点p(x,y)的初值p0
%n个定点的坐标x0,y0
%中间相邻两定点到p的距离差(最后一个点与起点求差)
function [p,norm,res,exit,out]=pfun(p0,x0,y0,det)
%判断det输入的正确性
n=length(det);
for i=1:n-1
if abs(det(i))>sqrt((x0(i)-x0(i+1))^2+(y0(i)-y0(i+1))^2);
error('abs(det) is greater than the disdance of two point')
end
end
if abs(det(n))>sqrt((x0(n)-x0(1))^2+(y0(n)-y0(1))^2)
error('abs(det) is greater than the disdance of two point')
end
%下降算法采用Levenberg-Marquardt法
%函数调用最大次数为1000
%由用户定义目标函数的雅可比矩阵
opt1=optimset('LargeScale','off','MaxFunEvals',1000,'Jacobian','on');
%用非线性最小二乘命令求p(x,y),x=p(1),y=p(2)
[p,norm,res,exit,out]=lsqnonlin(@dfun,p0,[],[],opt1,x0,y0,det);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%建立含雅可比矩阵的pfun.m文件
function [f,g]=dfun(p,x0,y0,det)
n=length(det);
for i=1:n-1
f(i)=sqrt((p(1)-x0(i))^2+(p(2)-y0(i))^2)-...
sqrt((p(1)-x0(i+1))^2+(p(2)-y0(i+1))^2)-det(i);
end
f(n)=sqrt((p(1)-x0(n))^2+(p(2)-y0(n))^2)-...
sqrt((p(1)-x0(1))^2+(p(2)-y0(1))^2)-det(n);
%当函数用两个输出参数调用时
if nargout>1
%计算雅可比矩阵
for i=1:n-1
g(i,1)=(p(1)-x0(i))/sqrt((p(1)-x0(i))^2+(p(2)-y0(i))^2)-...
(p(1)-x0(i+1))/sqrt((p(1)-x0(i+1))^2+(p(2)-y0(i+1))^2);
g(i,2)=(p(2)-y0(i))/sqrt((p(1)-x0(i))^2+(p(2)-y0(i))^2)-...
(p(2)-y0(i+1))/sqrt((p(1)-x0(i+1))^2+(p(2)-y0(i+1))^2);
end
g(n,1)=(p(1)-x0(n))/sqrt((p(1)-x0(n))^2+(p(2)-y0(n))^2)-...
(p(1)-x0(1))/sqrt((p(1)-x0(1))^2+(p(2)-y0(1))^2);
g(n,2)=(p(2)-y0(n))/sqrt((p(1)-x0(n))^2+(p(2)-y0(n))^2)-...
(p(2)-y0(1))/sqrt((p(1)-x0(1))^2+(p(2)-y0(1))^2);
end
例如各点关系如下:
输入:
x0=[0.5,0,0];
y0=[2+sqrt(3)/2,2,0];
det=[sqrt(3)-2,2-2*sqrt(2),2*sqrt(2)-sqrt(3)];
p0=[1,1];
[p,norm,res,exit,out]=pfun(p0,x0,y0,det)
输出:
p =
2.0000 2.0000
matlab解带参数的非线性方程组
由于方程个数3>未知数个数2,且涉及到距离的计算,所以原问题是求解一个超定(非线性)方程组.平方和形式这里采用最小二乘法解决(n个定点与未知点的计算,n>=2):先建立pfun.m文件:给出待求点p(x,y)的初值p0%n个定点的坐标x0,y0 中间相邻两定点到p的距离差(最后一个点与起点求差)fu...
如何使用MATLAB解非线性方程组
用solve函数。例如:x^2+y^3=10 x^3-y^2=1 其中x,y为方程组的未知量 在Matlab的命名窗口中输入:syms x y [x y]=solve('x^2+y=10','x^2-y^2=1','x','y')输出计算结果为:x = (37^(1\/2)\/2 + 21\/2)^(1\/2)(21\/2 - 37^(1\/2)\/2)^(1\/2)-(21\/2 - 1\/2*...
怎么在MATLAB程序中求解参数变化的非线性方程组,并返回方程组的解
怎么在MATLAB程序中求解参数变化的非线性方程组,并返回方程组的解。可以这样来处理:1、用已定义的函数文件,即文件名为Area3.m function F=Area3(canshu)qijk=8.8;wh=1.18;Aijk=0.9;th_in=451.43;tc_out=351.1805;ke_ijk=0.1;th_out=canshu(1); tc_in=canshu(2); F(1)=qij...
用matlab求带参数又带求和号的非线性方程组的数值解?
sum(1-y^m)=sum(1)-sum(y^m)=M-y*(1-y^M)\/(1-y) %y~=1时 x,y~=1时,原式可化为 x-exp(-a*(M-y*(1-y^M)\/(1-y)))=0 y-exp(-b*(M-x*(1-x^M)\/(1-x)))=0 代码:syms x y;a=1;b=2;M=2;S=solve( x-exp(-a*(M-y*(1-y^M)\/(1-y))),...
matlab 如何解非线性方程组
使用solve函数。举个例子,解非线性方程组 x^2+y^3=10 x^3-y^2=1 其中x,y为方程组的未知量 在Matlab的命名窗口中输入:syms x y [x y]=solve('x^2+y=10','x^2-y^2=1','x','y')即可 输出计算结果为:x = (37^(1\/2)\/2 + 21\/2)^(1\/2)(21\/2 - 37^(1\/2)\/2)...
matlab非线性方程组求解仿真
2、变参数非线性方程组的求解 对于求解非线性方程组一般用fsolve命令就可以了,但是对于方程组中某一系数是变化的,该怎么求呢?定义方程组如下,其中k为变量 function F = myfun(x,k)H=0.32;Pc0=0.23;W=0.18;F=[Pc0+H*(1+1.5*(x(1)\/W-1)-0.5*(x(1)\/W-1)^3)-x(2);x(...
用matlab解非线性方程组怎么最快?
利用MATLAB求解线性方程组,步骤如下:1. 输入方程组的系数矩阵A,点击计算按钮,根据结果情况判断是否有解,若有解则计算基础解系。2. 输入非齐次方程组的系数矩阵A和增广矩阵b,点击计算按钮,根据结果情况判断是否有解,若有解则计算基础解系和特解,若有唯一解则求出唯一解。3. 点击清除按钮,...
matlab求解非线性方程组
syms y xdata = 0:0.1:0.7;% 步长0.1可以修改 ydata = [];for x = xdata sy = solve(11.29*x==0.45*(11.29*(x+y))^0.78);ydata(end+1) = eval(sy);end plot(xdata, ydata);这里用循环取值体现系数x变化了。所以,只要把未知数声明成符号变量就可以,系数直接写就成,...
MATLAB的solve函数求非线性解方程或方程组
MATLAB的solve函数是一个强大的工具,用于处理各种代数方程和非线性方程的求解任务。它的使用方法包括但不限于:单变量方程求解通过以下步骤,我们可以使用solve函数来求解一个单变量方程:编写程序:[x, sol] = solve(equation, variable)运行结果:程序执行后,输出变量x的解sol方程组求解对于方程组,其...
Matlab解非线性方程组
对于带变量的非线性方程组,可以用Matlab的for循环语句和vpasolve函数联合求解。实现方法:m=0:0.01:1;for i=1:length(m)syms x y z f1=cos(x)-cos(y)+cos(z)-m(i);f2=cos(5*x)-cos(5*y)+cos(5*z);f3=cos(7*x)-cos(7*y)+cos(7*z);[x1(i),y1(i),z1(i)]=vpasolve...