欧拉法及其他改进方法——Matlab实现

欧拉法

这篇博客介绍了欧拉法及其他改进方法的实现,主要是以下几种方法:
- 前向欧拉法
- 后向欧拉法
- 梯形方法
- 改进欧拉法

代码实现见博客最后方


算法实现

  • 分别采用前向欧拉法,后向欧拉法,梯形方法,改进欧拉方法分别求解求解常微分方程初值问题 y’=y-2x/y,y(0)=1,计算区间为[0, 1],步长为 0.1。

设计思路

  • 前向欧拉法,以当前点的值为初值,当前点的导数为导数,计算下一个步长的点的值
  • 后向欧拉法,以当前点的值为初值,当下一个步长的点的导数为导数,计算下一个步长的点的值,但需要用最新的下一个点的值来计算导数,不断迭代直到收敛
  • 梯形方法,以当前点的值为初值,当前点的导数和下一个步长的点的导数平均数为导数,计算下一个步长的点的值,但需要用最新的下一个点的值来计算导数,不断迭代直到收敛
  • 改进欧拉法,以当前点的值为初值,当前点的导数和下一个步长的点的导数平均数为导数,计算下一个步长的点的值,不需要进行迭代计算,只用计算一步即可

数值实验

  • 前向欧拉法求出的近似解与精确解的关系
    这里写图片描述
  • 后向欧拉法求出的近似解与精确解的关系
    这里写图片描述
  • 梯形方法求出的近似解与精确解的关系
    这里写图片描述
  • 改进欧拉法求出的近似解与精确解的关系
    这里写图片描述

结果分析

由于本道题,很明显函数是随着x的增大,y在不断的增大,只是增大的速度逐渐减小

  • 前向欧拉法,由于是用前一点的导数来计算,因此明显大于精确解,且之间的差越来越大
  • 后向欧拉法,由于是用后一点的导数来计算,因此明显小于精确解,且直接的差越来越小
  • 梯形方法,由图中可以看到,由于综合了两点的导数,因此求出来的解跟精确解相差不大
  • 改进欧拉法,同上,求出来的解,比起梯形方法差了点,但是比起前两种方法改良了不少
  • 综上所述,梯形方法跟改进欧拉法求出来的值比较好,两者之间的比较,可以得知,梯形的计算代价远远高于改进欧拉法,因此改进欧拉法比较适合计算机的计算

实现代码

  • 前向欧拉法
clear;
format long;
a = 0;
b = 1;
h = 0.1;
d = 1;
res = forward(a, b, h, d);
x = res(1,:);
y = res(2,:);
z = [1, 1.0954, 1.1832, 1.2649, 1.3416, 1.4142, 1.4832, 1.5492, 1.6125, 1.6733, 1.7321];
y(2,:) = z;
plot(x, y);

function result = forward(a, b, h, y)
    n = (b-a)/h;
    x0 = a;
    x1 = a;
    y0 = y;
    result(1,1) = x0;
    result(2,1) = y0;

    for m = 0:n-1
        x1 = x1 + h;
        f0 = y0 - 2*x0/y0;
        y1 = y0 + h*f0;
        x0 = x1;
        y0 = y1;
        result(1, m+2) = x0;
        result(2, m+2) = y0;

    end
end
  • 后向欧拉法
clear;
format long;
a = 0;
b = 1;
h = 0.1;
d = 1;
res = forward(a, b, h, d);
x = res(1,:);
y = res(2,:);
z = [1, 1.0954, 1.1832, 1.2649, 1.3416, 1.4142, 1.4832, 1.5492, 1.6125, 1.6733, 1.7321];
y(2,:) = z;
plot(x, y);

function result = forward(a, b, h, y)
    n = (b-a)/h;
    x0 = a;
    x1 = a;
    y0 = y;
    result(1,1) = x0;
    result(2,1) = y0;

    for m = 0:n-1
        x1 = x1 + h;
        f0 = y0 - 2*x0/y0;
        d = y0 + h*f0;
        y1 = calculate(y0, x1, d, h);
        %result = calculate(x1, d, h);
        x0 = x1;
        y0 = y1;
        result(1, m+2) = x0;
        result(2, m+2) = y0;

    end
end

function result = calculate(y0, x1, y1, h)

    acc = -6;
    now = 0.0;
    z1 = y1;

    while now >= -6

        z0 = z1;
        f0 = z0 - 2*x1/z0;
        z1 = y0 + h*f0;
        now = log10(abs(z1-z0));

    end
    result = z1;
end
  • 梯形方法
clear;
format long;
a = 0;
b = 1;
h = 0.1;
d = 1;
res = forward(a, b, h, d);
x = res(1,:);
y = res(2,:);
z = [1, 1.0954, 1.1832, 1.2649, 1.3416, 1.4142, 1.4832, 1.5492, 1.6125, 1.6733, 1.7321];
y(2,:) = z;
plot(x, y);

function result = forward(a, b, h, y)
    n = (b-a)/h;
    x0 = a;
    x1 = a;
    y0 = y;
    result(1,1) = x0;
    result(2,1) = y0;

    for m = 0:n-1
        x1 = x1 + h;
        f0 = y0 - 2*x0/y0;
        d = y0 + h*f0;
        y1 = calculate(y0, x1, d, h, f0);
        x0 = x1;
        y0 = y1;
        result(1, m+2) = x0;
        result(2, m+2) = y0;

    end
end

function result = calculate(y0, x1, y1, h, f0)

    acc = -6;
    now = 0.0;
    z1 = y1;

    while now >= acc

        z0 = z1;
        f1 = z0 - 2*x1/z0;
        z1 = y0 + h/2*(f0+f1);
        now = log10(abs(z1-z0));
    end

    result = z1;
end
  • 改进欧拉法
clear;
format long;
a = 0;
b = 1;
h = 0.1;
d = 1;
res = forward(a, b, h, d);
x = res(1,:);
y = res(2,:);
z = [1, 1.0954, 1.1832, 1.2649, 1.3416, 1.4142, 1.4832, 1.5492, 1.6125, 1.6733, 1.7321];
y(2,:) = z;
plot(x, y);

function result = forward(a, b, h, y)
    n = (b-a)/h;
    x0 = a;
    x1 = a;
    y0 = y;
    result(1,1) = x0;
    result(2,1) = y0;

    for m = 0:n-1
        x1 = x1 + h;
        f0 = y0 - 2*x0/y0;
        d = y0 + h*f0;
        f1 = d - 2*x1/d;
        y1 = y0 + h/2*(f0+f1);
        x0 = x1;
        y0 = y1;
        result(1, m+2) = x0;
        result(2, m+2) = y0;

    end
end
欧拉方法是一种常用的数值方法,用于求解微分方程的初值问题。在MATLAB中,可以使用以下代码实现欧拉方法: ```MATLAB function [t, y = my_euler(f, t0, tf, y0, h) M = floor((tf - t0) / h); t = zeros(M+1, 1); y = zeros(M+1, 1); t = (t0:h:tf)'; y(1) = y0; for i = 1:M y(i+1) = y(i) + h * feval(f, t(i), y(i)); end end ``` 其中,f是微分方程的右端函数,t0和tf是计算区间的起始和终止点,y0是初值,h是步长。这段代码定义了一个名为`my_euler`的函数,可以传入相应的参数,返回离散化的时间点t和对应的数值解y。在循环中,通过欧拉方法的迭代公式来逐步计算数值解。 需要注意的是,该代码是通过前向欧拉法实现欧拉方法。其他改进方法,如后向欧拉法、梯形方法改进欧拉方法,可以通过对上述代码稍作修改来实现。例如,后向欧拉法可以将迭代公式改为`y(i+1) = y(i) + h * feval(f, t(i+1), y(i+1))`,梯形方法可以使用梯形公式进行迭代计算,改进欧拉方法可以使用改进公式进行迭代计算。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [欧拉法及其他改进方法——Matlab实现](https://blog.csdn.net/qq_36312878/article/details/80945781)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [matlab:使用欧拉方法求解微分方程](https://blog.csdn.net/qq_41708281/article/details/124243519)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [前向欧拉法、后向欧拉法、梯形方法改进欧拉方法MATLAB](https://download.csdn.net/download/qq_36318771/11030011)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值