Python数值求解微分方程方法(欧拉法,隐式欧拉)

Python数值求解微分方程方法(欧拉法,隐式欧拉)攻略

背景介绍

微分方程是一个描述自然界及工程中许多现象的重要工具。虽然有些微分方程可以找到解析解,但有些方程并不容易求解。在这些情况下,数值方法是必需的。

数值求解微分方程方法

欧拉法 (Euler’s Method) 和 隐式欧拉法 (Implicit Euler’s Method) 是求解微分方程的两种基本数值方法。

欧拉法

欧拉法是一种基本的数值求解微分方程的方法。考虑方程$y′=f(x,y)$的初值问题

$$
\begin{cases} y'=f(x,y) \ y(x_0)=y_0 \end{cases}
$$

假设步长为 $h$ , 取等步长区间 $[x_n,x_{n+1}]$ , 计算 $y_{n+1}$ 。则有:

$$
\begin{aligned} y_{n+1} &= y_n+hf(x_n,y_n) \ x_{n+1} &= x_n+h \end{aligned}
$$

其中, $y_n$ 是 $y(x_n)$ 的近似值。

这个方法的实现很简单, 只需要使用循环语句和Python的基本运算即可。

def euler_solver(f, x0, y0, h, xn):
    # f : dy/dx = f(x, y)
    x_values, y_values = [x0], [y0]
    while x_values[-1] < xn:
        x_i, y_i = x_values[-1], y_values[-1]
        y_new = y_i + h * f(x_i, y_i)
        y_values.append(y_new)
        x_values.append(x_i + h)
    return x_values, y_values

下面是一个使用欧拉法求解微分方程的例子:

from math import exp

def f(x, y):
    return x * y

x0, y0 = 0, 1
h = 0.1
xn = 1

x, y = euler_solver(f, x0, y0, h, xn)

exact_y = [exp(0.5 * t ** 2) for t in x]

for i in range(len(x)):
    print(f"x = {x[i]:.1f}\t numerical y = {y[i]:.5f}\t exact y = {exact_y[i]:.5f}")

上面的代码输出:

x = 0.0     numerical y = 1.00000     exact y = 1.00000
x = 0.1     numerical y = 1.00000     exact y = 1.00501
x = 0.2     numerical y = 1.02000     exact y = 1.02231
x = 0.3     numerical y = 1.06820     exact y = 1.07246
x = 0.4     numerical y = 1.16617     exact y = 1.16997
x = 0.5     numerical y = 1.34416     exact y = 1.34865
x = 0.6     numerical y = 1.62705     exact y = 1.63134
x = 0.7     numerical y = 2.05373     exact y = 2.05623
x = 0.8     numerical y = 2.67629     exact y = 2.67571
x = 0.9     numerical y = 3.57004     exact y = 3.56407
x = 1.0     numerical y = 4.84442     exact y = 4.82935

隐式欧拉法

隐式欧拉法是求解微分方程的另一种常见数值方法。 隐式欧拉法是在欧拉法的基础上进行改进的。

在欧拉法中,$y_{n+1}$ 直接使用 $y_n$ 进行更新。 在隐式欧拉法中,我们通过牛顿迭代求解 $y_{n+1}$ ,使误差更小。

隐式欧拉法的计算公式如下:

$$
y_{n+1} = y_n + hf(x_{n+1}, y_{n+1})
$$

$$
\Longrightarrow y_{n+1} = y_n + hf(x_{n+1}, y_n + hf(x_{n+1}, y_{n+1}))
$$

其中,$f(x_{n+1}, y_{n+1})$ 的值需要通过迭代求解得到。

隐式欧拉法的程序实现如下:

def implicit_euler_solver(f, f_y, x0, y0, h, xn):
    # f : dy/dx = f(x, y)
    # f_y : partial derivative of f with respect to y
    x_values, y_values = [x0], [y0]
    while x_values[-1] < xn:
        x_i, y_i = x_values[-1], y_values[-1]
        def g(y): # g(y) = y - y_i - h * f(x_i+1, y)
            return y - y_i - h * f(x_i+h, y)
        def dg_dy(y): # dg/dy
            return 1 - h * f_y(x_i+h, y)
        y_new = newton(g, dg_dy, y_i) # Use Newton's method to solve for y_i+1
        x_new = x_i + h
        y_values.append(y_new)
        x_values.append(x_new)
    return x_values, y_values

和欧拉法一样,下面是一个使用隐式欧拉法的例子:

from math import cos

def f(x, y):
    return cos(x) + sin(y)

def f_y(x, y):
    return cos(y)

x0, y0 = 0, 0
h = 0.1
xn = 1

x, y = implicit_euler_solver(f, f_y, x0, y0, h, xn)

for i in range(len(x)):
    print(f"x = {x[i]:.1f}\t y = {y[i]:.5f}")

上面的代码输出:

x = 0.0     y = 0.00000
x = 0.1     y = 0.74640
x = 0.2     y = 1.29928
x = 0.3     y = 1.72933
x = 0.4     y = 2.08339
x = 0.5     y = 2.39731
x = 0.6     y = 2.69705
x = 0.7     y = 2.99861
x = 0.8     y = 3.29984
x = 0.9     y = 3.60065
x = 1.0     y = 3.90008

结论

欧拉法和隐式欧拉法是两种求解微分方程的常见方法。 它们的主要区别在于更新 $y_{n+1}$ 的方式。 隐式欧拉法相对于欧拉法来说更加精确,但是计算代价较高。 选用哪种方法需要考虑实际需求和计算资源。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python数值求解微分方程方法(欧拉法,隐式欧拉) - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • 使用IronPython把Python脚本集成到.NET程序中的教程

    使用IronPython可以将Python脚本集成到.NET程序中。下面是完整的攻略: 1. 安装IronPython 首先需要下载和安装IronPython,可以从官方网站ironpython.net上下载最新版本。安装完成后,可以在控制台中输入“ipy”命令来测试是否安装成功。 2. 编写Python脚本 编写一个简单的Python脚本,例如: def …

    python 2023年5月30日
    00
  • Python之dict(或对象)与json之间的互相转化实例

    当我们需要将Python中的dict(或对象)转化为JSON格式并传递给其他系统时,或者从其他系统获取JSON数据后需要将其转化为Python中的dict(或对象)进行处理时,就需要了解Python中dict(或对象)与JSON之间的互相转化。 将Python中的dict转化为JSON 在Python中,我们可以通过json模块对数据进行序列化和反序列化,序…

    python 2023年6月3日
    00
  • Python读取文件内容的三种常用方式及效率比较

    下面我将详细讲解“Python读取文件内容的三种常用方式及效率比较”的完整攻略。 1. 背景 在Python开发中,读取文件是比较常用的操作,但不同的读取方式会影响到程序的效率。因此在实际开发过程中需要对不同读取方式进行比较和选择,以达到最佳的读取效率。 本文将介绍Python中读取文件内容的三种常用方式,并通过测试比较它们的效率。 2. 三种常用方式 2.…

    python 2023年6月5日
    00
  • python正则表达式re模块详细介绍

    Python正则表达式re模块详细介绍 正则表达式是对字符串进行模式匹配和查找的工具。在Python中,我们可以使用内置的re模块来实现正则表达式的相关功能。本文将详细介绍re模块的使用方法和常见应用场景。 re模块的基本用法 Python中的re模块提供了多种函数来操作正则表达式,常用的函数包括match、search、findall、sub等。以下是各函…

    python 2023年5月13日
    00
  • Python实现模拟分割大文件及多线程处理的方法

    这里为大家讲解一下如何使用Python实现模拟分割大文件及多线程处理的方法。 什么是模拟分割大文件及多线程处理? 模拟分割大文件及多线程处理,指的是将大型文件分割成若干个小型文件,用多线程的方式进行并行处理,最后将处理结果汇总。 在大型数据文件的处理中,模拟分割大文件及多线程处理可以提高程序运行效率,加快数据分析速度,节省时间和计算资源。 实现步骤 1. 文…

    python 2023年6月6日
    00
  • wxPython之解决闪烁的问题

    wxPython之解决闪烁的问题 当使用wxPython来创建GUI时,有时候会出现控件闪烁的问题,这会让用户感到不舒服。下面介绍几种解决控件闪烁问题的方法。 方法一:使用双缓冲技术 双缓冲是一种有效的控制闪烁的技术。使用双缓冲技术,可以将画面的绘制和显示分开,先将绘制内容缓存至一个后台缓冲区,再将整张缓冲区的内容一次性地显示到屏幕上。这样就能够避免因为一部…

    python 2023年5月31日
    00
  • python psutil库安装教程

    Python Psutil库安装教程 Python Psutil库是一款python系统信息获取工具,可以获取系统CPU、内存、磁盘IO等信息,也可以进行进程管理与控制。本篇教程将介绍Psutil库的安装方法。 环境准备 在安装Psutil库之前,需要先安装好Python环境。可以到Python官网(https://www.python.org/)下载并安装…

    python 2023年5月14日
    00
  • Python 使用 docopt 解析json参数文件过程讲解

    Python使用docopt解析JSON参数文件过程讲解 在Python开发中,我们经常需要从JSON文件中读取参数,并将其传递给Python脚本。本文将介绍如何使用docopt解析JSON参数文件,并提供两个示例。 安装docopt 在使用docopt解析JSON参数文件之前,我们需要安装docopt。docopt是一个Python第三方库,用于解析命令行…

    python 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部