抛物线法非线性方程求解
- 格式:docx
- 大小:795.51 KB
- 文档页数:25
非线性方程求根问题教材中,对于非线性方程求根问题,主要考虑迭代法。
于是教材中大篇幅介绍了迭代的过程,之后又具体论述了开方法和牛顿法以及牛顿法的改进。
对于迭代过程的描述,首先进行根的隔离。
考虑将某个范围划分成若干个子段,然后判断哪个子段有根。
即通过在给定区间上,从左端点出发按一定步长一步一步向右跨,每跨一步进行一次根的搜索。
采用根的二分搜索使加工规模减半。
其次,进行迭代过程的设计。
其间运用压缩映像原理和局部收敛性定理来判断迭代过程是否对于迭代初值收敛。
第三,由于迭代过程的冗长,考虑迭代加速。
对迭代过程论述清楚后,介绍开方法和牛顿法。
这两者都是按照迭代函数,到迭代收敛性判定,再到迭代加速的顺序展开论述的。
其中对于改进的牛顿法还涉及到了弦截法,此法在之后文章将会有提到。
开方法迭代函数:)(21)(xa x x +=ϕ 牛顿法迭代函数:)()()('x f x f x x -=ϕ 牛顿法改进(引入下山因子λ)迭代公式:)()('1k k k k x f x f x x λ-=+ 弦截法迭代函数:)()()()()(00x x x f x f x f x x ---=ϕ 接下来讨论一种新的迭代法——抛物线法。
基本原理与算法抛物线法是求多项式方程0)(=x P 的实根和复根的有效方法,也可用来求一般函数方程0)(=x f 根。
抛物线法是正割法的推广。
设有非线性方程0)(=x f (1)首先给出方程(1)根*x 的三个初始近似值0x ,1x ,2x 过三个点(0x ,)(0x f ),(1x ,)(1x f ),(2x ,)(2x f ),可构造二次插值多项式0)(2=x P ,用它来代替')(x f ,求0)(2=x P 的根,记为3x 作为0)(=x f 根*x 的第3次近似值,这就是抛物线法(设(0x ,)(0x f ),(1x ,)(1x f ),(2x ,)(2x f )三点不共线)。
非线性抛物线法的特点牛顿迭代法虽然具有收敛速度快的优点,但每迭代一次都要计算函数导数,而有些函数的导数计算十分麻烦。
弦截法和抛物线法便是为了避免上述不便而提出的方法.一、弦截法:牛顿迭代公式: x k + 1 = x k − f ( x k ) f ′ ( x k ) 牛顿迭代公式:\\ x_{k+1}=x_k-\frac{f(x_k)}{f^{'}(x_k)}\\ 牛顿迭代公式:xk+1=xk−f′(xk)f(xk)替换牛顿公式中的f’(x),便得到迭代公式: x k + 1 = x k − f ( x k ) ( x k − x k − 1 ) f ( x k ) − f ( x k − 1 ) 这就是弦截迭代公式 . x_{k+1}=x_k-\frac{f(x_k)(x_k-x_{k-1})}{f(x_k)-f(x_{k-1})}\\ 这就是弦截迭代公式. xk+1=xk−f(xk)−f(xk−1)f(xk)(xk−xk−1)这就是弦截迭代公式.算法流程:注意,弦截迭代发要用到前两步的结果:x k 和 x k − 1 . x_{k}和x_{k-1}. xk和xk−1.二、抛物线法根据牛顿多项式插值公式: N n ( x ) = a 0 + a 1 ( x −x 0 ) + a 2 ( x − x 0 ) ( x − x 1 ) + . . . + a n( x − x 0 ) ( x − x 1 ) ⋯ ( x − x n − 1 )N_n(x)=a_0+a_1(x-x_0)+a_2(x-x_0)(x-x_1)+...+a_n(x-x_0)(x-x_1)\cdots(x-x_{n-1}) Nn(x)=a0+a1(x−x0)+a2(x−x0)(x−x1)+...+an(x−x0)(x−x1)⋯(x−xn−1)取三次牛顿插值公式得: N 2 ( x ) = f ( x k ) + f [ x k , x k − 1 ] ( x − x k ) + f [ x k , x k − 1 , x k − 2 ] ( x − x k ) ( x − x k − 1 )N_2(x)=f(x_k)+f[x_k,x_{k-1}](x-x_k)+f[x_k,x_{k-1},x_{k-2}](x-x_k)(x-x_{k-1}) N2(x)=f(xk)+f[xk,xk−1](x−xk)+f[xk,xk−1,xk−2](x−xk)(x−xk−1)令上式等于0,得到: x k + 1 = x k − 2 f ( x k ) ω ± ω − 4 f ( x k ) f [ x k , x k − 1 , x k − 2 ] 式中:x_{k+1}=x_k-\frac{2f(x_k)}{\omega±\sqrt{\omega-4f(x_k)f[x_k,x_{k-1},x_{k-2}]}}\\ 式中:\\ xk+1=xk−ω±ω−4f(xk)f[xk,xk−1,xk−2]2f(xk)式中:{ f [ x k , x k − 1 ] = f ( x k ) − f ( x k − 1 ) x k − x k − 1 f [ x k , x k − 1 , x k − 2 ] ( x k −x k − 1 ) = f [ x k , x k − 1 ] − f [ x k − 2 , x k − 2 ] x k − x k − 2 ω = f [ x k , x k − 1 ] + f [ x k , x k − 1 , x k − 2 ] ( x k − x k − 1 )\begin{cases} f[x_k,x_{k-1}]=\frac{f(x_k)-f(x_{k-1})}{x_k-x_{k-1}} \\ \\ f[x_k,x_{k-1},x_{k-2}](x_k-x_{k-1})= \frac{f[x_k,x_{k-1}]-f[x_{k-2},x_{k-2}]}{x_k-x_{k-2}}\\ \\ \omega=f[x_k,x_{k-1}]+f[x_k,x_{k-1},x_{k-2}](x_k-x_{k-1})\\ \end{cases} ⎩⎩⎩⎩⎩⎩⎩⎩⎩⎩⎩⎩⎩⎩⎩f[xk,xk−1]=xk−xk−1f(xk)−f(xk−1)f[xk,xk−1,xk−2](xk−xk−1)=xk−xk−2f[xk,xk−1]−f[xk−2,xk−2]ω=f[xk,xk−1]+f[xk,xk−1 ,xk−2](xk−xk−1)上式计算可以得到两个值,选择解得时候应该选择离xk更接近的解.弦截法和抛物线法只是对迭代公式进行了更改,并不影响算法的流程,可以参考链接中的代码进行算法仿真.链接非线性方程求解:二分迭代法和牛顿迭代法。
《MATLAB 程序设计实践》课程考核抛物线法非线性方程求解算法说明:(1)选定初始值210,,x x x ,并计算)(),(),(210x f x f x f 和以下差分: ],[12x x f =1212)()(x x x f x f --10101)()(],[x x x f x f x x f --=20112012],[],[],,[x x x x f x x f x x x f --=一般取b x a b x a x <<==210,,。
注意不要使三点共线。
(2)用牛顿插值法对三点))(,()),(,()),(,(221100x f x x f x x f x 进行插值得到一条抛物线,它有两个根:,24223CACB B x x -±-+= 其中。
)](,,[],[],,,[),(12012120102x x x x x f x x f B x x x f C x f A -+===两个根中只取靠近2x 的那个根,即±号取于B 同号, 即ACB B B Ax x 4)sgn(2223-+-=(3)用321,,x x x 代替210,,x x x ,重复以上步骤,并有以下递推公式: nn nn n nn n C A B B B A x x 4)sgn(221-+-=+,其中。
)](,,[],[],,,[),(121121-------+===n n n n n n n n n n n n n n x x x x x f x x f B x x x f C x f A(4)进行精度控制。
算法流程图:成立抛物线法的MATLAB程序代码如下:function root=Parabola(f,a,b,x,eps)%抛物线法求函数 f在区间【a,b】上的一个零点%函数名:f%区间左端点: a%区间右端点:b%初始迭代点:x%根的精度:eps%求出的函数零点:rootif(nargin==4)eps=1.0e-4;endf1=subs(sym(f),findsym(sym(f)),a);f2=subs(sym(f),findsym(sym(f)),b);if(f1==0)root=a;endif(f2==0)root=b;endif(f1*f2>0)disp(‘两端点函数值乘积大于0!’);return;elsetol=1;fa=subs(sym(f),findsym(sym(f)),a);fb=subs(sym(f),findsym(sym(f)),a);fx=subs(sym(f),findsym(sym(f)),x);d1=(fb-fa)/(b-a);d2=(fx-fb)/(x-b);d3=(f2-f1)/(x-a);B=d2+d3*(x-b);root=x-2*fx/(B+sign(B)*sqrt(B^2-4*fx*d3)); t=zeros(3); t(1)=a; t(2)=b; t(3)=x; while(tol>eps)t(1)=t(2); %保存3个点 t(2)=t(3); t(3)=root;f1=subs(sym(f),findsym(sym(f)),t(1)); %计算3个点的函数值 f2=subs(sym(f),findsym(sym(f)),t(2)); f3=subs(sym(f),findsym(sym(f)),t(3));d1=(f2-f1)/(t(2)-t(1)); %计算3个差分 d2=(f3-f2)/(t(3)-t(2)); d3=(d2-d1)/(t(3)-t(1));B=d2+d3*(t(3)-t(2)); %计算算法中的B root=t(3)-2*f3/(B+sign(B)*sqrt(B^2-4*f3*d3)); tol=abs(root-t(3)); end end举例应用:采用抛物线法求方程2lg =+x x 在区间[1,4]上的一个根。
求解非线性方程与二次曲线性质在数学中,我们经常会遇到非线性方程与二次曲线。
这些问题在高中数学中就已经开始学习,而在大学中,这些知识被更深入地学习和应用。
在本文中,我们将讨论如何求解非线性方程以及二次曲线的一些基本性质。
求解非线性方程非线性方程指的是在未知量的一次以上的项中,至少有一项不是常数。
例如,$ax^2+bx+c=0$ 就是一个非线性方程,其中 $a$,$b$,$c$ 都是常数,$x$ 是未知量。
解非线性方程的方法有很多种,下面我们讨论常用方法。
1. 二分法二分法是解非线性方程的一种简单方法。
假设我们需要求方程$f(x)=0$ 的根,那么我们可以先找到一个区间 $[a,b]$,使得$f(a)$ 和 $f(b)$ 的符号不同。
然后我们从区间的中点 $c$ 开始,计算 $f(c)$ 的符号。
如果 $f(c)$ 的符号与 $f(a)$ 相同,那么我们可以将 $a$ 替换为 $c$,否则将 $b$ 替换为 $c$。
接着我们再计算$c$ 的中点,用同样的方法来判断符号。
不断重复这个过程,直到求得一个满足误差限的根。
2. 牛顿迭代法牛顿迭代法是一种基于泰勒级数的求根方法,具有快速收敛的特点,但需要计算函数的导数。
假设我们要求解方程 $f(x)=0$ 的根,我们可以选择一个初值 $x_0$,然后按照下面的公式迭代求解:$$x_{i+1}=x_i-\frac{f(x_i)}{f'(x_i)}$$其中,$f'(x_i)$ 是 $f(x)$ 在 $x_i$ 处的导数。
不断重复迭代,直到满足误差限。
二次曲线的性质二次曲线是用一般式表示的形如$ax^2+by^2+2hxy+2gx+2fy+c=0$ 的方程。
在本节中,我们将讨论二次曲线的一些基本性质。
1. 对称轴对称轴是指将二次曲线对称的轴。
以一般式表示的二次曲线的对称轴方程是:$$y=-\frac{b}{2a}x-\frac{h}{a}y-\frac{g}{a}$$其中,$a$,$b$,$h$,$g$ 表示二次曲线的系数。
各类非线性方程的解法非线性方程是一类数学方程,其中包含了一个或多个非线性项。
求解非线性方程是数学研究中的重要问题之一,它在科学、工程和经济等领域具有广泛的应用。
本文将介绍几种常见的非线性方程的解法。
1. 试-and-错误法试-and-错误法是求解非线性方程的最简单方法之一。
它基于逐步尝试的思路,通过不断试验不同的数值来逼近方程的解。
这种方法的缺点在于需要反复试验,效率较低,但对于简单的方程或近似解的求解是有效的。
2. 迭代法迭代法是一种常用的数值计算方法,可以用来求解非线性方程的近似解。
它的基本思想是通过迭代计算逐步逼近方程的解。
不同的迭代方法包括牛顿迭代法、弦截法和割线法等。
这些方法都是基于线性近似的原理,通过不断迭代计算来逼近解。
迭代法的优点是可以得到较为精确的解,适用于多种类型的非线性方程。
3. 数值优化方法数值优化方法是一种求解非线性方程的高级方法,它将问题转化为优化问题,并通过优化算法来寻找方程的最优解。
常用的数值优化方法包括梯度下降法、牛顿法和拟牛顿法等。
这些方法通过不断迭代调整变量的取值,以最小化目标函数,从而求解非线性方程。
数值优化方法的优点是可以处理复杂的非线性方程,并且具有较高的求解精度。
4. 特殊非线性方程的解法对于特殊的非线性方程,还可以使用特定的解法进行求解。
例如,对于二次方程可以使用公式法直接求解,对于三次方程可以使用卡尔达诺法等。
这些特殊解法适用于特定类型的非线性方程,并且具有快速和精确的求解能力。
综上所述,非线性方程的解法有试-and-错误法、迭代法、数值优化方法和特殊非线性方程的解法等。
根据具体的方程类型和求解要求,选择合适的方法进行求解,可以得到满意的结果。
非线性方程的求解方法一、引言在数学领域中,非线性方程是指未知量与其对自身的各次幂、指数以及任意函数相乘或相加得到的方程。
求解非线性方程是数学中一个重要而又具有挑战性的问题。
本文将介绍几种常见的非线性方程求解方法。
二、牛顿迭代法牛顿迭代法是一种经典的非线性方程求解方法,它利用方程的切线逼近根的位置。
设f(x)为非线性方程,在初始点x0附近取切线方程y=f'(x0)(x-x0)+f(x0),令切线方程的值为0,则可得到切线方程的解为x1=x0-f(x0)/f'(x0)。
重复这个过程直到满足精确度要求或迭代次数达到指定次数。
三、二分法二分法是一种简单而又直观的非线性方程求解方法。
它利用了连续函数的中间值定理,即若f(a)和f(b)异号,则方程f(x)=0在[a, b]之间必有根。
根据中值定理,我们可以取中点c=(a+b)/2,然后比较f(a)和f(c)的符号,若同号,则根必然在右半区间,否则在左半区间。
重复这个过程直到满足精确度要求或迭代次数达到指定次数。
四、割线法割线法是一种基于切线逼近的非线性方程求解方法,它与牛顿迭代法相似。
由于牛顿迭代法需要求解导数,而割线法不需要。
设f(x)为非线性方程,在两个初始点x0和x1附近取一条直线,该直线通过点(x0,f(x0))和(x1, f(x1)),它的方程为y=f(x0)+(f(x1)-f(x0))/(x1-x0)*(x-x0),令直线方程的值为0,则可得到直线方程的解为x2 = x1 - (f(x1)*(x1-x0))/(f(x1)-f(x0))重复这个过程直到满足精确度要求或迭代次数达到指定次数。
五、试位法试位法是一种迭代逼近的非线性方程求解方法。
它利用了函数值的变化率来逼近根的位置。
设f(x)为非线性方程,选取两个初始点x0和x1,然后计算f(x0)和f(x1)的乘积,如果结果为正,则根位于另一侧,否则根位于另一侧。
然后再选取一个新的点作为下一个迭代点,直到满足精确度要求或迭代次数达到指定次数。
求解非线性方程组的几种方法及程序实现
求解非线性方程组一直是理论数学和应用数学研究的重点,并采用不同的方法得到准确的结果。
它们可以分为几种类型:
1. 用以绘图的方法解非线性方程组:该方法充分利用结合几何和数理的原理,给出非线性方程组的解,而不用对系数的解的表达式求解手段。
主要是利用可绘图的几何空间分析,它可以帮助理解问题本身,还可以很容易看出非线性方程组的解。
2. 用迭代法求解非线性方程组:这是一种常用的方法,它通过不断迭代收敛求解非线性方程组。
基本思想是通过构造一个迭代函数,其初始值和原始非线性方程组尽可能接近,然后不断迭代收敛求解非线性方程组。
3. 用强调法求解非线性方程系统:这是基于梯度的一种方法,它利用一个概念,即局部线性化,可以降低维数、转化为一个拐点,最后强化搜索全局解。
4. 用牛顿-拉夫逊方法求解非线性方程组:这是一种准确、快速的非线性方程组求解方法,主要利用牛顿迭代法搜索解的收敛性,加上一些拉夫逊的加速策略得到最终的结果。
5. 用幂法求解非线性方程组:幂法也称为指数序列,是一种重要的求解非线性方程组的方法,基本原理是利用指数的累加和误差的减少,从而最终得到非线性方程组的解。
6. 用逐步逼近法求解非线性方程组:逐步逼近法也称为分步变程法,是一种用于求解非线性方程组的简单方法,其基本思想是用不同的参数,在给定的范围内,逐步逼近目标解。
这些方法的程序实现略有不同,可以利用编程语言比如C、Fortran、Python等,编写程序完成求解。
可以采用函数求解、循环求解、行列式求解或者混合的算法等不同的方式实现,甚至可以用深度学习方法求解有些复杂的非线性方程组。
二次函数的非线性方程求解二次函数是具有一条抛物线形状的函数,其代数表达式为y=ax^2+bx+c,其中a、b、c为实数且a不等于零。
当遇到二次函数的非线性方程时,要求解方程的根(即使方程等式成立的x值),我们可以采用以下方法进行求解。
一、用因式分解法求解二次函数的非线性方程对于形如ax^2+bx+c=0的二次函数方程,我们可以通过因式分解的方法来求解。
步骤如下:1. 将方程整理为标准形式,即将二次项系数a移至方程左侧,将常数项c移至右侧,得到ax^2+bx=-c。
2. 考虑二次函数的性质,根据因式分解法,我们需要找到两个数p 和q,使得它们的和等于一次项系数b,乘积等于二次项系数a乘以常数项-c。
即p+q=b,pq=ac。
3. 通过观察和试错,找到满足上述要求的p和q。
4. 将原方程拆分为两个一次函数方程,即将x项用p和q来替代,得到(ax-p)(ax-q)=0。
5. 根据乘法法则,等式成立时,要么ax-p=0,要么ax-q=0。
解这两个一次函数方程,即可得到方程的根。
例如,对于方程2x^2-5x+3=0,按照因式分解法进行求解:1. 将方程整理为标准形式,得到2x^2-5x=-3。
2. 观察得知,-1和-3满足p+q=-5,pq=6。
3. 将方程拆分为(2x-1)(x-3)=0。
4. 解得x=1/2 或 x=3,这两个值即为方程的根。
二、用配方法求解二次函数的非线性方程除了因式分解法,我们还可以使用配方法来求解二次函数的非线性方程。
步骤如下:1. 将方程整理为标准形式,即将二次项系数a移至方程左侧,将常数项c移至右侧,得到ax^2+bx=-c。
2. 考虑二次函数的性质,通过配方法,我们需要找到一个数k,使得二次项可以表示成(x+k)^2的形式。
3. 将原方程改写成(x+k)^2=-c。
4. 将方程展开并化简,得到x^2+2kx+k^2=-c。
5. 根据二次项系数和常数项的关系,可以得到k的值。
《MATLAB 程序设计实践》课程考核抛物线法非线性方程求解算法说明:(1)选定初始值210,,x x x ,并计算)(),(),(210x f x f x f 和以下差分: ],[12x x f =1212)()(x x x f x f --10101)()(],[x x x f x f x x f --=20112012],[],[],,[x x x x f x x f x x x f --=一般取b x a b x a x <<==210,,。
注意不要使三点共线。
(2)用牛顿插值法对三点))(,()),(,()),(,(221100x f x x f x x f x 进行插值得到一条抛物线,它有两个根:,24223CACB B x x -±-+= 其中。
)](,,[],[],,,[),(12012120102x x x x x f x x f B x x x f C x f A -+===两个根中只取靠近2x 的那个根,即±号取于B 同号, 即ACB B B Ax x 4)sgn(2223-+-=(3)用321,,x x x 代替210,,x x x ,重复以上步骤,并有以下递推公式: nn nn n nn n C A B B B A x x 4)sgn(221-+-=+,其中。
)](,,[],[],,,[),(121121-------+===n n n n n n n n n n n n n n x x x x x f x x f B x x x f C x f A(4)进行精度控制。
算法流程图:成立抛物线法的MATLAB程序代码如下:function root=Parabola(f,a,b,x,eps)%抛物线法求函数 f在区间【a,b】上的一个零点%函数名:f%区间左端点: a%区间右端点:b%初始迭代点:x%根的精度:eps%求出的函数零点:rootif(nargin==4)eps=1.0e-4;endf1=subs(sym(f),findsym(sym(f)),a);f2=subs(sym(f),findsym(sym(f)),b);if(f1==0)root=a;endif(f2==0)root=b;endif(f1*f2>0)disp(‘两端点函数值乘积大于0!’);return;elsetol=1;fa=subs(sym(f),findsym(sym(f)),a);fb=subs(sym(f),findsym(sym(f)),a);fx=subs(sym(f),findsym(sym(f)),x);d1=(fb-fa)/(b-a);d2=(fx-fb)/(x-b);d3=(f2-f1)/(x-a);B=d2+d3*(x-b);root=x-2*fx/(B+sign(B)*sqrt(B^2-4*fx*d3)); t=zeros(3); t(1)=a; t(2)=b; t(3)=x; while(tol>eps)t(1)=t(2); %保存3个点 t(2)=t(3); t(3)=root;f1=subs(sym(f),findsym(sym(f)),t(1)); %计算3个点的函数值 f2=subs(sym(f),findsym(sym(f)),t(2)); f3=subs(sym(f),findsym(sym(f)),t(3));d1=(f2-f1)/(t(2)-t(1)); %计算3个差分 d2=(f3-f2)/(t(3)-t(2)); d3=(d2-d1)/(t(3)-t(1));B=d2+d3*(t(3)-t(2)); %计算算法中的B root=t(3)-2*f3/(B+sign(B)*sqrt(B^2-4*f3*d3)); tol=abs(root-t(3)); end end举例应用:采用抛物线法求方程2lg =+x x 在区间[1,4]上的一个根。
流程图:解:在MA TLAB 命令窗口中输入: >> r=Parabola('sqrt(x)+log(x)-2',1,4,2) r =1.8773实验1用ode45、ode23、ode113解下列微分方程 流程图 编辑相应方程的M 文件是(1)y’=x-y,y(0)=1,0<x<3 (要求输出x=1、2、3点的y值); >> [x,y]=ode45('fun',[1,2,3],1)x =123y =1.00001.36792.1353>> [x,y]=ode23('fun',[1,2,3],1)x =123y =1.00001.36772.1352>> [x,y]=ode113('fun',[1,2,3],1) x =123y =1.00001.36792.1353(2)x’=2x+3y,y’=2x-y,x(0)=-2.7,y(0)=2.8,0<t<10,作相平面图;>>ode45(‘fun2’,[0,10],[-2.7,2.8])>> ode23('fun2',[0,10],[-2.7,2.8])>> ode113('fun2',[0,10],[-2.7,2.8])(3)50,1)0(',0)0(),sin(2)'(01.0''2<<===+-t y y t y y y ,作y 的图; 解:将多阶微分方程变为一阶微分方程⎪⎩⎪⎨⎧==211y dt dy y y因此原方程可改写成:)sin(201.0''122221t y y y y y +-==编辑M 文件fun3.m计算以及绘图程序如下: ode45:>> [t,y]=ode45('fun3',[0,5],[0,1]); >> plot(t,y(:,1))得到y 的图线如下:y 值如下:ode23:>> [t,y]=ode23('fun3',[0,5],[0,1]); >> plot(t,y(:,1))得到y 值的图如下:y值如下:Ode113:>> [t,y]=ode113('fun3',[0,5],[0,1]); >> plot(t,y(:,1))得到y值的图如下:Y值如下:(4)20,1)0(',2)0(,45)(3)('5)(''22<<===--txxetxtxtx t,作x的图;解:ode45:>> [t,x]=ode45('fun4',[0,2],[2,1]);plot(t,x(:,1))Ode23:>> [t,x]=ode23('fun4',[0,2],[2,1]);plot(t,x(:,1))Ode113:>> [t,x]=ode113('fun4',[0,2],[2,1]);plot(t,x(:,1))(5)Vanderpol方程当mu=2时编辑M文件Vanderpol2.mOde45:>> [x,y]=ode45('Vanderpol2',[0,20],[2,0]);plot(x,y)Ode23:>> [x,y]=ode23('Vanderpol2',[0,20],[2,0]);plot(x,y)Ode113:>> [x,y]=ode113('Vanderpol2',[0,20],[2,0]);plot(x,y)当mu=1时编辑M文件Vanderpol.mOde45:>> [x,y]=ode45('Vanderpol',[0,20],[2,0]);plot(x,y)Ode23:>> [x,y]=ode23('Vanderpol',[0,20],[2,0]);plot(x,y)Ode113:>> [x,y]=ode113('Vanderpol',[0,20],[2,0]);plot(x,y)实验3 分别用ode45流程图:解:在命令窗口输入:>>ode45(‘f’,[0,50],[1,-1])>>ode15s(‘f’,[0,50],[1,-1])编制命令文件bj1.m和bj2.m分别运行得>> bj1t =13.2500>> bj2t =0.3900可以看出ode15s的计算效率比ode45高很多。
实验4流程图:解:将二阶微分方程转化成一阶微分方程:⎪⎪⎪⎩⎪⎪⎪⎨⎧====)4()3()2()1(x dt dy x y x dt dx x x源程序代码:function dx=appolo(t,x)mu=1/82.45;lamda=1-mu;x=x(1);y=x(3);r1=sqrt((x(1)+mu)^2+x(3)^2);r2=sqrt((x(1)+lamda)^2+x(3)^2);dx/dt=x(2);dx @/dt 2=2*x(4)+x(1)-lamda*(x(1)+mu)/r1^3-mu*(x(1)-lamda)/r2^3;dy/dt=x(4);dy @/dt 2=-2*x(2)+x(3)-lamda*x(3)/r1^3-mu*x(3)/r2^3];在命令窗口输入如下程序:>>x0=[1.2;0;0;-1.04935371]; (设定边间条件:微分方程的条件,将边界条件存放在一个4行1列的矩阵x0中)>>options=odeset('reltol',1e-8);(options 是积分参数设置条件,误差条件,为ode45设置相对误差:1e-8,reltol 相对误差)>>[t,y]=ode45('appolo',[0,20],x0,options); (ode 是求常微分方程的函数)>>plot(y(:,1),y(:,3)) (plot 是绘制二维图形的函数,用来画卫星轨迹,以y 矩阵第一列为x 轴,以其第三列为y 轴画图)>>title('Appolo 卫星运动轨迹')(图的标题)>>xlabel('X')(X 轴)>>ylabel('Y')(Y 轴)运行结果:。