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日

相关文章

  • Python实现学生管理系统的完整代码(面向对象)

    “Python实现学生管理系统的完整代码(面向对象)”是一个非常常见的Python实战项目,通过实现学生管理系统的完整代码,可以学习到Python面向对象编程的基础知识和应用。 下面介绍Python实现学生管理系统的完整攻略: 1. 确定系统需求和功能模块 在实现一个学生管理系统之前,我们需要先确定系统的需求和功能模块。通过需求分析,我们可以确定一个学生管理…

    python 2023年5月19日
    00
  • python工具模块介绍-time 时间访问和转换

    快速入门 In [1]: import time # 获取当前时间 In [25]: time.strftime(“%Y-%m-%d_%H-%M-%S”, time.localtime()) Out[25]: ‘2018-06-17_20-05-36’ # 停顿0.5秒 In [26]: time.sleep(0.5) 简介 功能:时间访问和转换。 相关模块…

    python 2023年4月25日
    00
  • Python爬虫爬取博客实现可视化过程解析

    我将为您提供详细的Python爬虫爬取博客实现可视化过程解析攻略。 1. 前期准备 在开始爬取博客内容之前,我们需要先安装一些必需的库。 pip install requests pip install beautifulsoup4 pip install lxml pip install pyecharts 其中,requests库是用于发送HTTP请求获…

    python 2023年5月14日
    00
  • python正则表达式及使用正则表达式的例子

    Python正则表达式及使用正则表达式的例子 正则表达式是一种用于描述字符串模式的语言,可以用于配、查找、替换和分割。在Python中,可以使用re模块使用正则表达式。本攻略将详细介绍Python中正则表达式的语法、字符集、转义字符以及常用函数,并提供两个示例说明。 正则表达式语法 正则表达式由普通字符和元字符组成,普通字符表示本身,而元字符有特殊的含义。下…

    python 2023年5月14日
    00
  • python可视化之颜色映射详解

    Python可视化之颜色映射详解 什么是颜色映射 颜色映射(Colormap),指将数值映射到颜色的过程。在可视化中,颜色映射常用于展示数据,将数据的大小、变化等信息通过颜色呈现出来,使图形更易于理解。 可视化库中的颜色映射 在 Python 的可视化库中,通常支持以下几种颜色映射: 顺序型:用于表示数据的大小变化,如 viridis; 发散型:用于表示数据…

    python 2023年6月3日
    00
  • Python之列表推导式最全汇总(上篇)

    以下是“Python之列表推导式最全汇总(上篇)”的完整攻略。 基本语法 列表推导式的基本语法形式为:[expression for item in iterable],其中expression是一个达式,item是可迭代对象中的元素,iterable是可迭代对象。以下是一个示例,演示如何使用列表推导式一个包含1到10的整数列表: # 生成包含1到10的整数…

    python 2023年5月13日
    00
  • 详解Python PIL ImageDraw.Draw.arc()

    Python PIL库中的ImageDraw模块提供了很多用于绘制基本图形和在图像上绘制文本和线条等的函数,其中Draw.arc()函数用于在给定的矩形内绘制一个圆弧。下面是关于使用Draw.arc()函数的完整攻略。 函数格式 Draw.arc(xy, start, end, fill=None, width=0) 参数说明: xy:指定圆弧的外接矩形,格…

    python-answer 2023年3月25日
    00
  • Python中Tkinter组件Menu的具体使用

    接下来我将为你详细讲解Python中Tkinter组件Menu的具体使用。 Tkinter的Menu组件 Tkinter中的Menu组件用于创建菜单栏。它可以嵌套在Tkinter窗口的顶部,并包含多个菜单和菜单项。 创建并显示一个简单的菜单栏 下面的代码演示如何创建一个简单的菜单栏,并向其添加菜单和菜单项: import tkinter as tk root…

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