python 解决微分方程的操作(数值解法)

Python求解微分方程(数值解法)

对于一些微分方程来说,数值解法对于求解具有很好的帮助,因为难以求得其原方程。

比如方程:

但是我们知道了它的初始条件,这对于我们叠代求解很有帮助,也是必须的。

那么现在我们也用Python去解决这一些问题,一般的数值解法有欧拉法、隐式梯形法等,我们也来看看这些算法对叠代的精度有什么区别?

```python
```python
import numpy as np
from scipy.integrate import odeint
from matplotlib import pyplot as plt
import os
#先从odeint函数直接求解微分方程
#创建欧拉法的类
class Euler:
    #构造方法,当创建对象的时候,自动执行的函数
    def __init__(self,h,y0):
        #将对象与对象的属性绑在一起
        self.h = h
        self.y0 = y0
        self.y = y0
        self.n = 1/self.h
        self.x = 0
        self.list = [1]
        #欧拉法用list列表,其x用y叠加储存
        self.list2 = [1]
        self.y1 = y0
        #改进欧拉法用list2列表,其x用y1叠加储存
        self.list3 = [1]
        self.y2 = y0
        #隐式梯形法用list3列表,其x用y2叠加储存
    #欧拉法的算法,算法返回t,x
    def countall(self):
        for i in range(int(self.n)):
            y_dere = -20*self.list[i]
            #欧拉法叠加量y_dere = -20 * x
            y_dere2 = -20*self.list2[i] + 0.5*400*self.h*self.list2[i]
            #改进欧拉法叠加量 y_dere2 = -20*x(k) + 0.5*400*delta_t*x(k)
            y_dere3 = (1-10*self.h)*self.list3[i]/(1+10*self.h)
            #隐式梯形法计算 y_dere3 = (1-10*delta_t)*x(k)/(1+10*delta_t)
            self.y += self.h*y_dere
            self.y1 += self.h*y_dere2
            self.y2 =y_dere3
            self.list.append(float("%.10f" %self.y))
            self.list2.append(float("%.10f"%self.y1))
            self.list3.append(float("%.10f"%self.y2))
        return np.linspace(0,1,int(self.n+1)), self.list,self.list2,self.list3
step = input("请输入你需要求解的步长:")
step = float(step)
work1 = Euler(step,1)
ax1,ay1,ay2,ay3 = work1.countall()
#画图工具plt
plt.figure(1)
plt.subplot(1,3,1)
plt.plot(ax1,ay1,'s-.',MarkerFaceColor = 'g')
plt.xlabel('横坐标t',fontproperties = 'simHei',fontsize =20)
plt.ylabel('纵坐标x',fontproperties = 'simHei',fontsize =20)
plt.title('欧拉法求解微分线性方程步长为'+str(step),fontproperties = 'simHei',fontsize =20)
plt.subplot(1,3,2)
plt.plot(ax1,ay2,'s-.',MarkerFaceColor = 'r')
plt.xlabel('横坐标t',fontproperties = 'simHei',fontsize =20)
plt.ylabel('纵坐标x',fontproperties = 'simHei',fontsize =20)
plt.title('改进欧拉法求解微分线性方程步长为'+str(step),fontproperties = 'simHei',fontsize =20)
plt.subplot(1,3,3)
plt.plot(ax1,ay3,'s-.',MarkerFaceColor = 'b')
plt.xlabel('横坐标t',fontproperties = 'simHei',fontsize =20)
plt.ylabel('纵坐标x',fontproperties = 'simHei',fontsize =20)
plt.title('隐式梯形法求解微分线性方程步长为'+str(step),fontproperties = 'simHei',fontsize =20)
plt.figure(2)
plt.plot(ax1,ay1,ax1,ay2,ax1,ay3,'s-.',MarkerSize = 3)
plt.xlabel('横坐标t',fontproperties = 'simHei',fontsize =20)
plt.ylabel('纵坐标x',fontproperties = 'simHei',fontsize =20)
plt.title('三合一图像步长为'+str(step),fontproperties = 'simHei',fontsize =20)
ax = plt.gca()
ax.legend(('$Eular$','$fixed Eular$','$trapezoid$'),loc = 'lower right',title = 'legend')
plt.show()
os.system("pause")

对于欧拉法,它的叠代方法是:

改进欧拉法的叠代方法:

隐式梯形法:

对于不同的步长,其求解的精度也会有很大的不同,我先放一几张结果图:

补充:基于python的微分方程数值解法求解电路模型

安装环境包

安装numpy(用于调节range) 和 matplotlib(用于绘图)

在命令行输入

pip install numpy
pip install matplotlib

电路模型和微分方程

模型1

无损害,电容电压为5V,电容为0.01F,电感为0.01H的并联谐振电路

电路模型1

微分方程1

模型2

带电阻损耗的电容电压为5V,电容为0.01F,电感为0.01H的的并联谐振

电路模型2

微分方程2

python代码

模型1

import numpy as np
import matplotlib.pyplot as plt

L = 0.01  #电容的值 F
C = 0.01  #电感的值 L
u_0 = 5   #电容的初始电压
u_dot_0 = 0

def equition(u,u_dot):#二阶方程
    u_double_dot = -u/(L*C)
    return u_double_dot

def draw_plot(time_step,time_scale):#时间步长和范围
    u = u_0
    u_dot = u_dot_0  #初始电压和电压的一阶导数
    time_list = [0] #时间lis
    Votage = [u] #电压list
    plt.figure()
    for time in np.arange(0,time_scale,time_step):#使用欧拉数值计算法 一阶近似
        u_double_dot = equition(u,u_dot) #二阶导数
        u_dot = u_dot + u_double_dot*time_step #一阶导数
        u = u + u_dot*time_step #电压
        time_list.append(time) #结果添加
        Votage.append(u) #结果添加
        print(u)
    plt.plot(time_list,Votage,"b--",linewidth=1) #画图
    plt.show()
    plt.savefig("easyplot.png")

if __name__ == '__main__':
    draw_plot(0.0001,1)

模型2

import numpy as np
import matplotlib.pyplot as plt

L = 0.01  #电容的值 F
C = 0.01  #电感的值 L
R = 0.1   #电阻值
u_0 = 5   #电容的初始电压
u_dot_0 = 0

def equition(u,u_dot):#二阶方程
    u_double_dot =(-R*C*u_dot -u)/(L*C)
    return u_double_dot

def draw_plot(time_step,time_scale):#时间步长和范围
    u = u_0
    u_dot = u_dot_0  #初始电压和电压的一阶导数
    time_list = [0] #时间lis
    Votage = [u] #电压list
    plt.figure()
    for time in np.arange(0,time_scale,time_step):#使用欧拉数值计算法 一阶近似
        u_double_dot = equition(u,u_dot) #二阶导数
        u_dot = u_dot + u_double_dot*time_step #一阶导数
        u = u + u_dot*time_step #电压
        time_list.append(time) #结果添加
        Votage.append(u) #结果添加
        print(u)
    plt.plot(time_list,Votage,"b-",linewidth=1) #画图
    plt.show()
    plt.savefig("result.png")

if __name__ == '__main__':
    draw_plot(0.0001,1)

数值解结果

模型1

纵轴为电容两端电压,横轴为时间与公式计算一致​​

模型2结果

纵轴

为电容两端电压,横轴为时间标题

最后我们可以根据调节电阻到达不同的状态

R=0.01,欠阻尼

R=1.7,临界阻尼

R=100,过阻尼

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python实现数值积分的Simpson方法实例分析

    本文实例讲述了python实现数值积分的Simpson方法.分享给大家供大家参考.具体如下: #coding = utf-8 #simpson 法计算积分,数值积分,效果非常理想 from math import * def func(x): """ 定义被积分函数 """ return x*sin(x) def Get_N(a,b,width): # width为步长 N=int((b-a)/width + 1) if N%2 == 0: N=

  • python中sympy库求常微分方程的用法

    问题1: 程序,如下 from sympy import * f = symbols('f', cls=Function) x = symbols('x') eq = Eq(f(x).diff(x, x) - 2*f(x).diff(x) + f(x), sin(x)) print(dsolve(eq, f(x))) 结果 Eq(f(x), (C1 + C2*x)*exp(x) + cos(x)/2) 附:布置考试中两题 1.利用python的Sympy库求解微分方程的解 y=f(x),并尝试利

  • python实现数学模型(插值、拟合和微分方程)

    问题1 车辆数量估计 题目描述 交通管理部门为了掌握一座桥梁的通行情况,在桥梁的一端每隔一段不等的时间,连续记录1min内通过桥梁的车辆数量,连续观测一天24h的通过车辆,车辆数据如下表所示.试建立模型分析估计这一天中总共有多少车辆通过这座桥梁. python 实现(关键程序) def get_line(xn, yn): def line(x): index = -1 # 找出x所在的区间 for i in range(1, len(xn)): if x <= xn[i]: index = i

  • python 解决微分方程的操作(数值解法)

    Python求解微分方程(数值解法) 对于一些微分方程来说,数值解法对于求解具有很好的帮助,因为难以求得其原方程. 比如方程: 但是我们知道了它的初始条件,这对于我们叠代求解很有帮助,也是必须的. 那么现在我们也用Python去解决这一些问题,一般的数值解法有欧拉法.隐式梯形法等,我们也来看看这些算法对叠代的精度有什么区别? ```python ```python import numpy as np from scipy.integrate import odeint from matplot

  • Python解决非线性规划中经济调度问题

    目录 1.概述 2.scipy.optimize.minimize参数 3.简单案例引出 (1)Scipy.optimize实现 (2)遗传算法包实现 (—sko.GA&sko.DE) 4.电力系统中应用——经济调度 (1)案例 (2)Scipy.optimize实现 (3)粒子群包实现(pyswarm) 1.概述 今天重点讲非线性规划中scipy.optimize.minize库在非线性规划中的应用.Scipy 是 Python 算法库和数学工具包,包括最优化.线性代数.积分.插值.特殊函数.

  • Python Pandas数据处理高频操作详解

    目录 引入依赖 算法相关依赖 获取数据 生成df 重命名列 增加列 缺失值处理 独热编码 替换值 删除列 数据筛选 差值计算 数据修改 时间格式转换 设置索引列 折线图 散点图 柱状图 热力图 66个最常用的pandas数据分析函数 从各种不同的来源和格式导入数据 导出数据 创建测试对象 查看.检查数据 数据选取 数据清理 筛选,排序和分组依据 数据合并 数据统计 16个函数,用于数据清洗 1.cat函数 2.contains 3.startswith/endswith 4.count 5.ge

  • Python解决爬虫程序卡死问题

    目录 前言: 简单粗暴解决问题 增加一点点难度的解决方案 我们继续给爬虫程序加点料 尾声 前言: 之前的文章我们已经开启了爬虫程序的exe之旅,但是我们最终实现的程序存在一个非常大的问题,当进行网络请求的时候,程序卡死,直到数据请求回来之后,程序才会从假死状态解脱出来,今天这篇博客核心将这个问题解决掉. 导致该问题产生的原因是GUI程序在执行高IO操作的时候很容易出现假死和无响应的状态,通用解决办法就是多线程. 如果想扩展开本知识点的学习,可以在搜索引擎搜索 tkinter假死,未响应等关键字即

  • python开发之list操作实例分析

    本文实例分析了python开发之list操作.分享给大家供大家参考,具体如下: 对python中list的操作,大家可以参考<Python list操作用法总结> 以下是我个人的笔记: #python list ''' 创建list有很多方法: 1.使用一对方括号创建一个空的list:[] 2.使用一对方括号,用','隔开里面的元素:[a, b, c], [a] 3.Using a list comprehension:[x for x in iterable] 4.Using the typ

  • Python矩阵常见运算操作实例总结

    本文实例讲述了Python矩阵常见运算操作.分享给大家供大家参考,具体如下: python的numpy库提供矩阵运算的功能,因此我们在需要矩阵运算的时候,需要导入numpy的包. 一.numpy的导入和使用 from numpy import *;#导入numpy的库函数 import numpy as np; #这个方式使用numpy的函数时,需要以np.开头. 二.矩阵的创建 由一维或二维数据创建矩阵 from numpy import *; a1=array([1,2,3]); a1=ma

  • Python解决N阶台阶走法问题的方法分析

    本文实例讲述了Python解决N阶台阶走法问题的方法.分享给大家供大家参考,具体如下: 题目:一栋楼有N阶楼梯,兔子每次可以跳1.2或3阶,问一共有多少种走法? Afanty的分析: 遇到这种求规律的问题,自己动动手推推就好,1阶有几种走法?2阶有几种走法?3阶有几种走法?4阶有几种走法?5阶有几种走法? 对吧,规律出来了! 易错点:这不是组合问题,因为第1次走1阶.第2次走2阶不同于 第1次走2阶.第2次走1阶 下面是Python的递归实现代码: def allMethods(stairs):

  • Python读取word文本操作详解

    本文研究的主要问题时Python读取word文本操作,分享了相关概念和实现代码,具体如下. 一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就是说python-docx模块会把word文档,文档中的段落.文本.字体等都看做对象,对对象进行处理就是对word文档的内容处理. 二,相关概念 如果需要读取word文档中的文字(一般来说,程序也只需要认识word文档中的文字信息),需要先了解python-docx模块的几个概念. 1,Docume

  • Python解决抛小球问题 求小球下落经历的距离之和示例

    本文实例讲述了Python解决抛小球问题 求小球下落经历的距离之和.分享给大家供大家参考,具体如下: 问题: 小东和三个朋友一起在楼上抛小球,他们站在楼房的不同层,假设小东站的楼层距离地面N米,球从他手里自由落下,每次落地后反跳回上次下落高度的一半,并以此类推知道全部落到地面不跳,求4个小球一共经过了多少米?(数字都为整数) 给定四个整数A,B,C,D,请返回所求结果 测试样例: 100,90,80,70 返回:1020 实现代码: class Balls: def calcDistance(s

  • Python解决八皇后问题示例

    本文实例讲述了Python解决八皇后问题的方法.分享给大家供大家参考,具体如下: 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上.八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n1×n1,而皇后个数也变成n2.而且仅当 n2 = 1 或 n1 ≥ 3 时问题有解. 这是一个典型的回溯算法,我们可以将问题进行分解: 首先,我们要想到某种方

随机推荐