matlab解带参数的非线性方程组

三个固定点坐标已知A(X1,Y1),B(X2,Y2),C(X3,Y3)。未知点(X,Y)。未知点到A/B距离差为det_ab,到B/C距离差为det_bc,到A/C距离差... 三个固定点坐标已知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代码~

另外,假如我这三个距离差有一定的误差,那么求解的时候怎样得到最优解呢?
展开
evolmath
2013-02-26 · TA获得超过2745个赞
知道小有建树答主
回答量:413
采纳率:100%
帮助的人:239万
展开全部

由于方程个数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

Sievers分析仪
2024-10-13 广告
是的。传统上,对于符合要求的内毒素检测,最终用户必须从标准内毒素库存瓶中构建至少一式两份三点标准曲线;必须有重复的阴性控制;每个样品和PPC必须一式两份。有了Sievers Eclipse内毒素检测仪,这些步骤可以通过使用预嵌入的内毒素标准... 点击进入详情页
本回答由Sievers分析仪提供
tianxiawulang
2013-02-26 · TA获得超过2.7万个赞
知道大有可为答主
回答量:4732
采纳率:89%
帮助的人:2654万
展开全部
1、问题分析:
到两点距离差为定值的点形成双曲线,你的问题相当于求三组双曲线的交点。
很显然,除非特殊情况(三个距离差满足一定约束),很难保证三组曲线交于一点。
如果如你所说“距离差有一定误差”,也就是不满足约束的条件,问题无解。在这种情况
下求解,一般按照最小二乘的规则,也就是说,使得未知点举例三个固定点的实际距离差
与给定距离差的总误差最小。这其实是一个优化问题。

2、问题描述:
如果用dA表示未知点到A点距离,dAB表示未知点到A、B两点的距离差(B、C类似),则
优化的目标函数可表示为
J = ( |dA-aB| - dAB )^2 + ( |dB-dC| - dBC )^2 + ( |dC-dA| - dCA )^2

3、程序说明
程序中把所需变量直接赋值,A、B、C为包括两个元素的向量,为固定点的坐标,dAB、
dBC、dCA为三个距离差。测试数据使用正三角形的顶点,距离差加了误差。
你要求写成函数的形式,从所给的代码很容易修改(把所需参数通过函数传入即可)。
由于程序中使用了匿名函数,所以必须在7.0以上版本使用。

function zd527752423

% 测试数据:正三角形的顶点
R = 5;
A = [R 0];
B = R*[cos(2*pi/3) sin(2*pi/3)];
C = R*[cos(4*pi/3) sin(4*pi/3)];

% 到三个顶点的距离差(理想情况三个都是0,现加入误差)
dAB = 0.1;
dBC = 0;
dCA = 0.2;

% 目标函数
J = @(x) (abs(d(x,A)-d(x,B))-dAB)^2 + (abs(d(x,B)-d(x,C))-dBC)^2 + (abs(d(x,C)-d(x,A))-dCA)^2;

% 调用优化算法求解,得到结果即为未知点坐标(X,Y)
x = fminsearch(J,[1 1]);
fprintf('\n未知点坐标:(%g, %g)\n',x);

% 绘图
pts = [A;B;C];
plot(pts(:,1), pts(:,2), 'o')
hold on
plot(x(1),x(2),'rx')
axis equal

function dis = d(p1, p2)
% 计算两点间距离的函数
dis = norm(p1-p2);
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式