改进欧拉方程求初值(十四)

改进欧拉方程的公式如下:

y p = y n + h f ( x n , y n ) y_{p}=y_{n}+h f\left(x_{n}, y_{n}\right) yp=yn+hf(xn,yn)
y c = y n + h f ( x n + 1 , y n ) y_{c}=y_{n}+h f\left(x_{n+1}, y_{n}\right) yc=yn+hf(xn+1,yn)
y n + 1 = 1 2 ( y p + y c ) y_{n+1}=\frac{1}{2}\left(y_{p}+y_{c}\right) yn+1=21(yp+yc)

利用改进后的欧拉方程建立M函数文件求解初值。函数文件如下所示:

function [x,y] = adeuler(f,x0,y0,xf,h)
n = fix((xf-x0)/h);
y(1)=y0;
x(1)=x0;
for i=1:n
    x(i+1) = x0+i*h;
    yp = y(i) + h*feval(f,x(i),y(i));
    yc = y(i) + h*feval(f,x(i+1),yp);
    y(i+1) = (yp+yc)/2;%欧拉公式
end

例 求解初值条件 { y ′ = y − 2 x y ( 0 < x < 1 ) y ( 0 ) = 1 \left\{\begin{array}{l}y^{\prime}=y-\frac{2 x}{y} \quad(0<x<1) \\ y(0)=1\end{array}\right. {y=yy2x(0<x<1)y(0)=1

MATLAB的程序如下:

 [x,y] = adeuler('f',0,1,1,0.1)

x =

  1 至 10 列

​     0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000    0.7000    0.8000    0.9000

  11 列

1.0000


y =

  1 至 10 列

1.0000    1.0959    1.1841    1.2662    1.3434    1.4164    1.4860    1.5525    1.6165    1.6782

  11 列

1.7379

y1 = (1+2*x).^0.5

y1 =

  1 至 10 列

1.0000    1.0954    1.1832    1.2649    1.3416    1.4142    1.4832    1.5492    1.6125    1.6733

  11 列

1.7321

plot(x,y,x,y1,'--')

图像结果如下所知:

在这里插入图片描述

由上面绘制曲线可以看出,改进的欧拉方程解法要比原来的方法优秀,数值解和解析解曲线能够重合。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
欧拉法改进欧拉法是常微分方程初值问题的数值解法之一。 欧拉法是一种简单的数值解法,它通过将微分方程转化为差分方程来逼近解。具体步骤如下: 1. 将区间[0, t]等分为n个小区间,步长为h=(t-0)/n。 2. 从初始条件y(0)=y0开始,使用差分方程y(i+1) = y(i) + h * f(x(i), y(i))进行迭代计算,其中f(x, y)是微分方程的右侧函数。 3. 重复步骤2,直到达到所需的计算区间。 改进欧拉法是对欧拉法改进,它通过使用两个不同的斜率来更准确地逼近解。具体步骤如下: 1. 将区间[0, t]等分为n个小区间,步长为h=(t-0)/n。 2. 从初始条件y(0)=y0开始,使用差分方程y(i+1) = y(i) + h/2 * (f(x(i), y(i)) + f(x(i+1), y(i+1)))进行迭代计算,其中f(x, y)是微分方程的右侧函数。 3. 重复步骤2,直到达到所需的计算区间。 这两种方法的优缺点如下: 欧拉法的优点是简单易懂,计算速度快,但精度较低,容易积累误差。 改进欧拉法相对于欧拉法来说,精度更高,误差更小,但计算量稍大。 下面是使用欧拉法改进欧拉法解决常微分方程初值问题的示例代码: 欧拉法: ```python def euler_method(f, x0, y0, h, n): x = [x0] y = [y0] for i in range(n): x.append(x[i] + h) y.append(y[i] + h * f(x[i], y[i])) return x, y # 示例微分方程:y' = y - 2*x/y def f(x, y): return y - 2*x/y x, y = euler_method(f, 0, 1, 0.1, 10) print("欧拉法解得的近似解为:", y) ``` 改进欧拉法: ```python def improved_euler_method(f, x0, y0, h, n): x = [x0] y = [y0] for i in range(n): x.append(x[i] + h) k1 = h * f(x[i], y[i]) k2 = h * f(x[i+1], y[i] + k1) y.append(y[i] + 0.5 * (k1 + k2)) return x, y x, y = improved_euler_method(f, 0, 1, 0.1, 10) print("改进欧拉法解得的近似解为:", y) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值