利用泰勒展开和牛顿迭代求解定位方程matlab仿真

1.实验名称

利用泰勒展开和牛顿迭代求解定位方程

2.实验背景

已知GPS接收机观测到的伪距方程,且伪距定位方程组是非线性方程组,同时方程数大于未知量数(即为超定方程),利用泰勒展开和牛顿迭代对定位方程进行求解,并对仿真结果进行分析。

3.实验原理

3.1牛顿迭代法求解非线性方程组

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2伪距

伪距是GPS接收机对卫星信号的一个最基本的距离测量值。伪距是由于卫星时钟与接收机时钟不同步产生的,测得的距离含有时钟误差和大气层折射延迟,而非“真实距离”,故称为伪距。

3.3 伪距定位原理

定义传播时延、星钟误差校正后的伪距观测方程为:
在这里插入图片描述

3.4 伪距定位算法

在得到N个卫星的观测量后,即可得到N个伪距测量方程。采用最小二乘法,N个非线性方程组的解算可以分为 5 步:
(1)数据准备与设计初值:
测量伪距,为接收机当前位置及接收机钟差设置初值。初值的选择:设置上次定位结果、用户输入位置和时间、卫星坐标均值在地面上的投影,或者全部设置为 0。
(2)非线性方程组线性化:
在当前历元k次牛顿迭代中,将方程进行线性化(考虑第n个方程):
在这里插入图片描述
在这里插入图片描述
全部观测方程也可以表示成矩阵方程组的形式。
(3)求解线性方程组:
利用最小二乘法求解GPS伪距定位线性矩阵方程组,若各个卫星测量值的误差方差以及权重已被确定,则可采用加权最小二乘算法求解。
(4)更新非线性方程组的根:
对接收机位置坐标及钟差进行更新。
在这里插入图片描述
(5)判断牛顿迭代的收敛性:
在这里插入图片描述

4.matlab仿真

4.1 仿真过程

(1)设GPS 接收机观测到的伪距方程为:
在这里插入图片描述
伪距定位方程组含两个未知数,三个方程,方程数大于未知量数,通过牛顿迭代与最小二乘法求解。

sat1=[4 2];
sat2=[3 5];
sat3=[-3 2];
sat=[sat1;sat2;sat3];%多卫星位置矩阵

(2)牛顿迭代法,设定迭代初值全部为0,即x=0,y=0,z=0;设最大迭代次数为100次;设迭代停止条件为误差小p<1e-10。
1)定位方程函数:

function f=position_f(xyt,sat,r)
	c=299792.458; %光速
	[m]=size(sat);
	for i=1:m
		f(i)=norm(sat(i,:)-xyt(1:2))+c*xyt(3)-r(i);
	end
	f=f';

其中,xyt(1:2)为用户位置(km),xyt(3)为用户钟差(s),r 为测量得到的伪距(km),sat 为卫星数据
2)多颗卫星定位的偏导数矩阵:

function df=position_df(xyt,sat)
	c=299792.458; %光速,km/s
	[m]=size(sat);
	xy=xyt(1:2);
	for i=1:m
		for j=1:2
			df(i,j)=(xy(j)-sat(i,j))/norm(sat(i,:)-xy(j));
		end
	end
	df(:,3)=c; %线性函数 ct,对 t 求偏导为 c

3)迭代过程:

delta=-df\f;
xyt(1)=xyt(1)+delta(1);
xyt(2)=xyt(2)+delta(2);
xyt(3)=xyt(3)+delta(3);
p=norm(delta); %定位精度
if (p<1e-10)
break;
 end
end

4.2 仿真结果

在这里插入图片描述最终迭代次数为23次,小于100次,故仿真结果正确。
在这里插入图片描述用户位置即伪距定位方程组的根为x=1,y=-2。
在这里插入图片描述
此时误差为7.7575e-11,小于1e-10,故仿真结果正确。

4.3 仿真结论

由于此伪距方程组比较简单,若直接把初值设为x=1,y=-2时,迭代次数为1且误差为 0,故x=1,y=-2满足条件。初值的选择很重要,可根据上次定位结果、用户输入位置和时间、卫星坐标均值在地面上的投影等确定,初值选取得越好,迭代次数越少,越快在允许精度误差范围内收敛于真值。

matlab代码链接: https://blog.csdn.net/qq_44394952/article/details/122259721?spm=1001.2014.3001.5502.

  • 9
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 泰勒展开牛顿迭代是一种常用的数值计算方法,用于求解非线性方程的根。在Matlab中,可以使用循环结构来实现该算法。 首先,我们定义一个函数来表示需要根的方程,假设为f(x)。然后,选择一个初始猜测值x0,并令x=x0。此后,通过泰勒展开牛顿迭代公式,可以得到下一个近似解x1的表达式,如下所示: x1 = x - f(x)/f'(x) 其中,f'(x)表示f(x)的一阶导数。 接下来,我们使用循环来迭代计算,直到满足指定的终止条件。一种常见的终止条件是设定一个最大迭代次数,或者当相邻次迭代结果的差值小于某个阈值时停止。 下面是一个使用Matlab实现泰勒展开牛顿迭代的简单例子: ```matlab % 定义方程函数 f = @(x) cos(x) - x; % 定义方程函数的一阶导数 df = @(x) -sin(x) - 1; % 设置初始猜测值和终止条件 x0 = 0.5; maxIter = 100; tol = 1e-6; % 迭代计算 for iter = 1:maxIter x1 = x0 - f(x0)/df(x0); % 判断终止条件 if abs(x1 - x0) < tol || abs(f(x1)) < tol break; end x0 = x1; end % 输出迭代结果 disp(['迭代次数:', num2str(iter)]); disp(['迭代结果:', num2str(x1)]); ``` 在该程序中,我们使用cos(x) - x = 0作为需要根的方程,通过迭代计算,找到了一个近似的根。 泰勒展开牛顿迭代是一种强大的数值计算方法,可以用于求解各种类型的非线性方程。当然,对于不同的方程,其迭代过程和求解结果可能有所不同,需要根据具体情况进行调整。 ### 回答2: 泰勒展开牛顿迭代求解非线性方程的一种方法,可以通过泰勒级数的近似来逼近方程的根。以下是使用Matlab编写的简单实例程序: 1. 首先,定义函数f(x),表示要求解的非线性方程。例如,假设我们求解方程x^2 - 3 = 0,可以定义函数为f(x) = x^2 - 3。 2. 然后,定义函数f_derivative(x),表示函数f(x)的导数。假设我们求解方程的导数为2x,可以定义函数为f_derivative(x) = 2x。 3. 接下来,定义牛顿迭代的函数newton_iter(x0),其中x0是初始猜测值。在每一次迭代中,使用泰勒级数展开近似函数的根,并更新当前的猜测值x。 ``` function [root, iterations] = newton_iter(x0) max_iterations = 100; tolerance = 1e-6; iterations = 0; while iterations < max_iterations iterations = iterations + 1; fval = f(x0); f_derivative_val = f_derivative(x0); delta_x = fval / f_derivative_val; x = x0 - delta_x; if abs(x - x0) < tolerance root = x; return; end x0 = x; end error('达到最大迭代次数但未找到解'); end ``` 4. 最后,调用函数newton_iter并给定初始猜测值x0,得到方程的近似根,并输出结果。 ``` x0 = 1; % 初始猜测值 [root, iterations] = newton_iter(x0); fprintf('方程的近似根为:%f\n', root); fprintf('迭代次数:%d\n', iterations); ``` 这样就可以使用Matlab编写一个简单的泰勒展开牛顿迭代的程序。请注意,实际的程序可能需要根据具体的方程进行修改和调整。 ### 回答3: 泰勒展开是一种数学方法,用来近似计算函数的值。而牛顿迭代是一种数值方法,用于解决方程或找到函数的根。在MATLAB中,可以将泰勒展开牛顿迭代结合起来实现更精确的数值计算。 假设我们要用泰勒展开来近似计算函数f(x)在某个点x0处的值,我们可以通过泰勒展开公式: f(x)=f(x0)+f'(x0)(x-x0)+f''(x0)/2!(x-x0)²+... 来完成近似计算。其中,f'(x0)表示函数f(x)在x0处的导数,f''(x0)表示函数f(x)在x0处的二阶导数,以此类推。 而牛顿迭代方法则是通过不断迭代逼近函数的根。假设我们要求解方程f(x)=0的根,首先选取一个初始近似值x0,然后通过牛顿迭代公式: x1 = x0 - f(x0)/f'(x0) x2 = x1 - f(x1)/f'(x1) ... 不断迭代,直到达到预定的精度要。 在MATLAB中,可以编写一个函数,将泰勒展开牛顿迭代结合起来。首先定义函数f(x),然后计算其导数f'(x)和二阶导数f''(x),接着使用牛顿迭代公式进行迭代计算,直到满足精度要为止。编写的程序类似如下: function result = newton_method(x0, epsilon) x = x0; while abs(f(x)) > epsilon x = x - f(x)/f_prime(x); end result = x; end 其中epsilon表示预设的精度要。这个程序会返回近似的根。 总之,泰勒展开牛顿迭代种数值计算方法,通过结合它们可以在MATLAB中实现更精确的数值计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值