【数值计算方法(黄明游)】常微分方程初值问题的数值积分法:欧拉方法(向后Euler)【理论到程序】

文章目录

  • 一、数值积分法
    • 1. 一般步骤
    • 2. 数值方法
  • 二、欧拉方法(Euler Method)
    • 1. 向前欧拉法(前向欧拉法)
    • 2. 向后欧拉法(后向欧拉法)
      • a. 基本理论
      • b. 算法实现

  常微分方程初值问题的数值积分法是一种通过数值方法求解给定初始条件下的常微分方程(Ordinary Differential Equations, ODEs)的问题。

一、数值积分法

1. 一般步骤

  1. 确定微分方程:

    • 给定微分方程组 y ′ ( x ) = f ( x , y ( x ) ) y'(x) = f(x, y(x)) y(x)=f(x,y(x))
  2. 确定初始条件:

    • 初值问题包含一个初始条件 y ( a ) = y 0 y(a) = y_0 y(a)=y0,其中 a a a 是定义域的起始点, y 0 y_0 y0 是初始值。
  3. 选择数值方法:

    • 选择适当的数值方法来近似解(需要考虑精度、稳定性和计算效率),常见的数值方法包括欧拉方法、改进的欧拉方法、Runge-Kutta 方法等。
  4. 离散化定义域:

    • 将定义域 [ a , b ] [a, b] [a,b] 分割为若干小步,即选择合适的步长 h h h。通常,较小的步长能够提高数值解的精度,但也增加计算成本。
  5. 数值迭代:

    • 使用选定的数值方法进行迭代计算:根据选择的方法,计算下一个点的函数值,并更新解。
  6. 判断停止条件:

    • 判断是否达到满足指定精度的近似解:可以使用某种误差估计方法,例如控制局部截断误差或全局误差。
  7. 输出结果:

    • 最终得到在给定定义域上满足初值问题的近似解。

2. 数值方法

  1. 欧拉方法(Euler Method):

    • 基本思想:根据微分方程的定义,使用离散步长逼近导数,进而逼近下一个点的函数值。
    • 公式: y n + 1 = y n + h f ( t n , y n ) y_{n+1} = y_n + h f(t_n, y_n) yn+1=yn+hf(tn,yn)
      其中, y n y_n yn是第 n n n 步的函数值, h h h是步长, f ( t n , y n ) f(t_n, y_n) f(tn,yn) 是在点 ( t n , y n ) (t_n, y_n) (tn,yn) 处的导数。
  2. 改进的欧拉方法(Improved Euler Method 或梯形法 Trapezoidal Rule):

    • 基本思想:使用两次近似来提高精度,首先使用欧拉方法计算中间点,然后用该点的导数估计值来计算下一个点。
    • 公式: y n + 1 = y n + h 2 [ f ( t n , y n ) + f ( t n + 1 , y n + h f ( t n , y n ) ) ] y_{n+1} = y_n + \frac{h}{2} [f(t_n, y_n) + f(t_{n+1}, y_n + hf(t_n, y_n))] yn+1=yn+2h[f(tn,yn)+f(tn+1,yn+hf(tn,yn))]
  3. Runge-Kutta 方法:

    • 基本思想:通过多个阶段的计算来提高精度。其中最常见的是四阶 Runge-Kutta 方法。
    • 公式:
      k 1 = h f ( t n , y n ) k_1 = hf(t_n, y_n) k1=hf(tn,yn) k 2 = h f ( t n + h 2 , y n + k 1 2 ) k_2 = hf(t_n + \frac{h}{2}, y_n + \frac{k_1}{2}) k2=hf(tn+2h,yn+2k1) k 3 = h f ( t n + h 2 , y n + k 2 2 ) k_3 = hf(t_n + \frac{h}{2}, y_n + \frac{k_2}{2}) k3=hf(tn+2h,yn+2k2) k 4 = h f ( t n + h , y n + k 3 ) k_4 = hf(t_n + h, y_n + k_3) k4=hf(tn+h,yn+k3) y n + 1 = y n + 1 6 ( k 1 + 2 k 2 + 2 k 3 + k 4 ) y_{n+1} = y_n + \frac{1}{6}(k_1 + 2k_2 + 2k_3 + k_4) yn+1=yn+61(k1+2k2+2k3+k4)

  这些方法中,步长 h h h 是一个关键参数,它决定了离散化的程度,选择合适的步长对于数值解的准确性和稳定性非常重要。

二、欧拉方法(Euler Method)

1. 向前欧拉法(前向欧拉法)

【计算方法与科学建模】常微分方程初值问题的数值积分法:欧拉方法(向前Euler及其python实现)

  • 向前差商近似微商:
    • 在节点 X n X_n Xn 处,通过向前差商 y ( X n + 1 ) − y ( X n ) h \frac{y(X_{n+1}) - y(X_n)}{h} hy(Xn+1)y(Xn) 近似替代微分方程 y ′ ( x ) = f ( x , y ( x ) ) y'(x) = f(x, y(x)) y(x)=f(x,y(x)) 中的导数项,得到 y ′ ( X n ) ≈ y ( X n + 1 ) − y ( X n ) h = f ( X n , y ( X n ) ) y'(X_n) \approx \frac{y(X_{n+1}) - y(X_n)}{h} = f(X_n, y(X_n)) y(Xn)hy(Xn+1)y(Xn)=f(Xn,y(Xn))
    • 这个近似通过将差商等于导数的思想,将微分方程转化为递推关系式。
  • 递推公式:
    • 将上述近似公式改为等式,得到递推公式 y n + 1 = y n + h f ( X n , y n ) y_{n+1} = y_n + hf(X_n, y_n) yn+1=yn+hf(Xn,yn)
    • 这个公式是 Euler 方法的核心,通过这个公式可以逐步计算得到近似解的数值。

2. 向后欧拉法(后向欧拉法)

a. 基本理论

  向后 Euler 方法的核心思想是从微分方程的 y ′ ( X n + 1 ) = f ( x n + 1 , y ( X n + 1 ) ) y'(X_{n+1}) = f(x_{n+1}, y(X_{n+1})) y(Xn+1)=f(xn+1,y(Xn+1)) 出发,使用向后差商 y ( X n + 1 ) − y ( X n ) h \frac{y(X_{n+1}) - y(X_n)}{h} hy(Xn+1)y(Xn) 近似微商 y ′ ( X n + 1 ) y'(X_{n+1}) y(Xn+1),然后通过这个近似来得到递推公式。具体而言,递推公式为:

y n + 1 = y n + h f ( X n + 1 , y n + 1 ) , n = 0 , 1 , … y_{n+1} = y_n + hf(X_{n+1}, y_{n+1}), \quad n = 0, 1, \ldots \ yn+1=yn+hf(Xn+1,yn+1),n=0,1, 

这里, y n + 1 y_{n+1} yn+1 是在 X n + 1 X_{n+1} Xn+1 处的近似解, h h h 是步长。

  对比向前 Euler 方法和向后 Euler 方法,可以注意到两者的关键区别:

  1. 显式 vs. 隐式:

    • 向前 Euler 方法给出了一个显式的递推公式,可以直接计算 y n + 1 y_{n+1} yn+1
    • 向后 Euler 方法给出了一个隐式的递推公式,其中 y n + 1 y_{n+1} yn+1出现在方程的右侧,需要通过求解非线性方程来获得。
  2. 求解方式:

    • 向前 Euler 方法的解可以通过简单的迭代计算得到。
    • 向后 Euler 方法的解需要通过迭代求解非线性方程,通常,可以使用迭代法,如牛顿迭代法,来逐步逼近方程的解。
  3. 具体的迭代过程

    • 初始值:使用向前 Euler 公式给出一个初值,例如 y n + 1 ( 0 ) = y n + h f ( x n + 1 , y n ) y_{n+1}^{(0)} = y_n + hf(x_{n+1}, y_n) yn+1(0)=yn+hf(xn+1,yn),其中 y n + 1 ( 0 ) y_{n+1}^{(0)} yn+1(0) 是迭代的初值。

    • 迭代公式:使用迭代公式 y n + 1 ( k + 1 ) = y n + h f ( x n + 1 , y n + 1 ( k ) ) , k = 0 , 1 , … y_{n+1}^{(k+1)} = y_n + hf(x_{n+1}, y_{n+1}^{(k)}), \quad k = 0, 1, \ldots yn+1(k+1)=yn+hf(xn+1,yn+1(k)),k=0,1,计算 y n + 1 y_{n+1} yn+1 的逼近值。

    • 重复迭代,直到满足收敛条件,得到 y n + 1 y_{n+1} yn+1 的近似解。

  向后 Euler 方法在处理某些问题(例如刚性问题)时可能更为稳定,但由于涉及隐式方程的求解,其计算成本可能较高。

b. 算法实现

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import fsolvedef forward_euler(f, y0, a, b, h):"""使用向前欧拉法求解一阶常微分方程初值问题Parameters:- f: 函数,表示微分方程的右侧项,形式为 f(x, y)- y0: 初始条件,表示在 x=a 处的函数值- a: 区间起点- b: 区间终点- h: 步长Returns:- x_values: 区间 [a, b] 上的离散节点- y_values: 对应节点上的函数值的近似解"""num_steps = int((b - a) / h) + 1  # 计算步数x_values = np.linspace(a, b, num_steps)  # 生成离散节点y_values = np.zeros(num_steps)  # 初始化结果数组y_values[0] = y0  # 设置初始条件# 使用向前欧拉法进行逐步迭代for i in range(1, num_steps):x = x_values[i - 1]y = y_values[i - 1]y_values[i] = y + h * f(x, y)return x_values, y_valuesdef backward_euler(f, y0, a, b, h):"""使用向后欧拉法求解一阶常微分方程初值问题Parameters:- f: 函数,表示微分方程的右侧项,形式为 f(x, y)- y0: 初始条件,表示在 x=a 处的函数值- a: 区间起点- b: 区间终点- h: 步长Returns:- x_values: 区间 [a, b] 上的离散节点- y_values: 对应节点上的函数值的近似解"""num_steps = int((b - a) / h) + 1  # 计算步数x_values = np.linspace(a, b, num_steps)  # 生成离散节点y_values = np.zeros(num_steps)  # 初始化结果数组y_values[0] = y0  # 设置初始条件# 使用向后欧拉法进行逐步迭代for i in range(1, num_steps):x = x_values[i]# 定义非线性方程equation = lambda y_next: y_next - y_values[i - 1] - h * f(x, y_next)# 利用 fsolve 求解非线性方程,得到 y_values[i]y_values[i] = fsolve(equation, y_values[i - 1])[0]return x_values, y_values# 示例:求解 y' = y -2x/y,初始条件 y(0) = 1 在区间 [0, 1] 上的近似解
def example_function(x, y):return y - 2 * x / ya, b = 0, 1  # 区间 [a, b]
y0 = 1  # 初始条件 y(0) = 1
h = 0.05  # 步长
x_values0, y_values0 = forward_euler(example_function, y0, a, b, h)x_values, y_values = backward_euler(example_function, y0, a, b, h)# 绘制结果
plt.plot(x_values0, y_values0, label='Forward Euler')
plt.plot(x_values, np.sqrt(1 + 2 * x_values), label='Exact Solution')
plt.plot(x_values, y_values, label='Backward Euler')
plt.title('h = {}'.format(h))
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
  • h = 0.1
    在这里插入图片描述

  • h = 0.05
    在这里插入图片描述

  • h = 0.02
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/182815.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webpack如何处理文件、图片

webpack5之前是通过,file-loader、raw-loader、url-loader处理文件 webpack5是通过使用资源模块类型(asset module type)处理文件 资源模块类型(asset module type),通过添加 4 种新的模块类型,来替换所有这些 loade…

Linux常用命令——rm 命令

文章目录 Linux系统中的rm命令是一个非常强大且危险的工具,用于删除文件和目录。由于其具有不可逆的特性,了解其参数和正确使用非常重要。 1. 基本用法 rm命令的基本格式是rm [选项] 文件或目录。不带任何选项时,rm命令仅删除文件。 示例&a…

python读取excel自动化生成sql建表语句和java实体类字段

1、首先准备一个excel文件: idtypenameidint学号namestring姓名ageint年龄sexstring性别weightdecimal(20,4)体重scoredecimal(20,4)分数 2、直接生成java字段和注释: import pandas as pddf pd.read_excel(test.xlsx, sheet_nameSheet1)for i in ran…

java 对象大小计算

说明: 对于64位机:一个对象由三部分组成 对象头(object header) mark word :64bitkclass pointer :32bit(默认使用指针压缩),如果取消指针压缩( XX:-UseCompressedOops),则占用64bit数组长度:数…

Zynq-Linux移植学习笔记之67- 国产ZYNQ上通过GPIO模拟MDC/MDIO协议

1、背景介绍 模块上有9个PHY,其中两个PHY通过ZYNQ PS端的MDIO总线连接,其余7个PHY单独通过GPIO进行控制,需要实现GPIO模拟MDC/MDIO协议。 2、vivado工程设计 vivado工程内为每个PHY建立两个GPIO IP核,分别用来代表MDC和MDIO&…

基于BP神经网络的手写体数字识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 filename dir(images\*.bmp); %图像文件格式 load BP.matfilename dir(test\*.bmp); …

PyQt基础_009_ 按钮类控件QSlider

基本功能 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class SliderDemo(QWidget):def __init__(self, parentNone):super(SliderDemo, self).__init__(parent)self.setWindowTitle("QSlider 例子") self.resize…

Google play开发者账号付款资料暂停的原因及解决方案

相信大多数Google play开发者都收到过这封邮件 邮件内容的大致意思是“由于可疑的活动,我们暂停了你的付款资料。” “要恢复您的帐户,请转到您的帐户并执行所要求的操作。” 这是触发了谷歌的付款风控机制,根据开发者们的反馈,账…

滴滴打车崩了!全过程

滴滴发布致歉10元补偿券,文末可领取 。 事情发生于 2023年11月27日晚~28日中午,滴滴打车服务出现大面积故障,登上微博热搜。 许多用户在使用滴滴出行时遇到了无法叫车、订单异常等问题,导致大量用户滞留在外,出行受阻…

2023年11月编程语言排行榜——你的编程语言上榜了吗?

编程语言的流行度是一个热门的话题,不同的机构和平台有不同的评判标准和排名方法。本文将以 TIOBE 编程社区指数为例,介绍 2023 年 11 月的编程语言趋势榜单,分析各种编程语言的表现和原因,以及对未来的展望。 TIOBE 编程社区指数…

【小黑嵌入式系统第二课】嵌入式系统的概述(二)——外围设备、处理器、ARM、操作系统

上一课: 【小黑嵌入式系统第一课】嵌入式系统的概述(一)——概念、特点、发展、应用 下一课: 【小黑嵌入式系统第三课】嵌入式系统硬件平台(一)——概述、总线、存储设备(RAM&ROM&FLASH…

QDoubleSpinBox的使用示例

QDoubleSpinBox即可以做为数值型输入框使用,也可以使用只读型数据显示框,在作为输入框使用时比QLineEdit有以下几个方面的优势 1.可以设置范围,并且范围精确, 2.输入数据精确,自动屏幕非数值以外的字符。 3.设置步长后…

文件基础知识

计算机中的流:在C语言中将通过输入/输出设备(键盘、内存、显示器、网络等)之间的数据传输抽象表述为“流”。 1、文本流和二进制流 在文本流中输入输出的数据是一系列的字符,可以被修改在二进制流中输入输出数据是一系列字节&am…

RabbitMQ消息模型之Sample

Hello World Hello World是官网给出的第一个模型,使用的交换机类型是直连direct,也是默认的交换机类型。 在上图的模型中,有以下概念: P:生产者,也就是要发送消息的程序C:消费者:消…

【Linux】gcc和g++

👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和Linux还有算法 ✈️专栏:Linux 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 …

git-4

1.在GitHub上创建个人仓库 现在仓库中有LICENSE文件,但本地没有这个文件,该怎么办呢?往下看 2.把本地仓库同步到GitHub 3.不同人修改了不同文件如何处理? 两个人在同一个分支上,两个人修改了不同文件 其中一人&…

Python 哈希表的实现——字典

哈喽大家好,我是咸鱼 接触过 Python 的小伙伴应该对【字典】这一数据类型都了解吧 虽然 Python 没有显式名称为“哈希表”的内置数据结构,但是字典是哈希表实现的数据结构 在 Python 中,字典的键(key)被哈希&#x…

出于隐私和安全的考虑,有时需要从谷歌删除你的个人数据,有两种方法

如果你是公众人物、企业或拥有个人品牌的人,那么拥有在线形象很重要。然而,你可能会发现,通过谷歌搜索,陌生人可以获得你的个人信息,如联系方式、地址和财务信息,这会让你感到不安。 幸运的是,…

系统频繁崩溃,如何考虑系统的稳定性和可扩展性?

最近网传互联网应用信息系统频繁崩溃,语雀崩完淘宝崩,淘宝崩完滴滴崩,随着业务的发展和技术的进步,对于信息系统的要求也越来越高。信息应用系统为了满足不断增长的用户和业务需求,提高系统的稳定性和扩展性至关重要。…

短 URL 生成器设计:百亿短 URL 怎样做到无冲突?

Java全能学习面试指南:https://javaxiaobear.cn 我们先来看看,当高并发遇到海量数据处理时的架构。在社交媒体上,人们经常需要分享一些 URL,但是有些 URL 可能会很长,比如: https://time.geekbang.org/hyb…