数学建模比赛有关Python解决常微分方程的一些总结

微分方程

一、涉及的库&基本语法语句有:

1. import sympy as sp

        用于求解微分方程(组)的通解或特解,只能求一个或一组两个方程的解

        ① x = sp.Symbol(‘x’) 定义自变量

        ② f = sp.Function(f) 定义函数

        ③ equation = sp.Eq(方程左边, 方程右边)

        ④ ans = sp.dsolve(equation, f(x))

            当要求特解时,则为:

            ans = sp.dsolve(equation, f(x), ics={f(x0): 相应的y值})

            当要求微分方程组(一组两式)解时,则为:

            ans = sp.dsolve([equation1, equation2])

        ⑤ sp.pprint(ans) sympy自带的输出形式

        ⑥ sp可以用以引出数学特殊符号

            sp.exp(指数)  或  sp.sin(x)

2. import numpy as np

        ① 在作图时生成数列的函数

            x = np.linspace(start, stop, num of steps)  

            此函数用于生成数列,start与因变量初始值相对应

            Eg:x = np.linspace(0,1,100)

            x = np.arrange(start, stop, length of steps)

            与上式效果相同

        ② np可以用以引出数学特殊符号,与sp的功能相同

            np.exp(指数)  或  np.sin(x)

3. import matplotlib.pyplot as plt

绘图的包

        ① 生成图像:

             plt.plot(自变量, 解决变量)

             需要生成标签时:

             plt.plot(自变量, 解决变量, label=名称)

             Eg: solution = odient(f, y0, x)

             plt.plot(x, solution, label=’x’)

        plt.xlim(a, b) 控制图中坐标轴范围

             plt.ylim(a, b)

        ③ plt.legend() 在图中展示标签

        ④ plt.title(标题) 在图中展示图名

        ⑤ plt.grid() 画格子

        ⑥ plt.show() 输出图像

4. from scipy.integrate import odient

在生成图像时解微分方程的包

        ① solution = odient(函数名, 因变量初始值, 自变量, tfirst=True/False, args=([常数1, 常数2]))

            Eg:solution = odient(f, y0, x, tfirst=True)

            args部分可以不加;tfirst部分也可以不加,True代表定义的函数中自变量

            在前,False反之

5. from scipy.integrate import solve_ivp

知道语法但不知道怎么用……总之是用来画图的

             ans = solve_ivp(函数名, 自变量范围, 因变量初始值, args=(常数1, 常数2))

             args=()部分不可以省略!

二、一些全局的视角概念

1. 关于函数的定义

        ① 对于进行绘图的题目,定义函数的形式为:

def f(u, t):
    x, y = u
    dxdt = 3*x-x*y
    dydt = 2*x-y+e**t
    dudt = [dxdt, dydt]

    return dudt

        ② 对于求通解/特解的题目,定义函数的形式为:

x = sp.Symbol(‘x’)
f = sp.Function(‘f’)
y = f(x)

equation = y.diff(x, 2) + sp.exp(2*y)  # y.diff(x, 2)即y对x求两次导

2.关于最后求解的公式

        ① 对于进行绘图的题目,最后求解的公式为:

solution = odeint(f, u0, t)

        ② 对于求通解/特解的题目,最后求解的公式为:

ans = sp.dsolve(equation, y, ics={f(1): 2 * sp.exp(1)})

3. 中间的其他部分

        ① 对于求特解通解的题目,equation语句后面直接跟ans=sp.dsolve语句

        ② 对于进行绘图的题目,中间还有如下一段:

u0 = [0, 0]
t = np.linspace(0, 10, 100)

        用来定义因变量的初始值和决定图中取点的情况

三、总结

求解:x′(t)=4∗x(t)−2∗y(t)    方程组,包括图像和通解

           y′(t)=2∗x(t)−y(t)​

# 求通解

import sympy as sp

# 定义自变量、因变量和函数
t = sp.symbols("t")
f1 = sp.Function("f1")
f2 = sp.Function("f2")
x = f1(t)
y = f2(t)

# 将两个等式带入
equation1 = x.diff(t, 1)- 4 * x + 2 * y
equation2 = y.diff(t, 1)- 2 * x + y

# 求解公式
ans = sp.dsolve([equation1, equation2], [x, y])

print(ans)
sp.pprint(ans)
# 作出图像

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt

# 定义函数
def f(t, u):
    x, y = u
    dxdt = 4 * x - 2 * y
    dydt = 2 * x - y
    dudt = [dxdt, dydt]
    return dudt

# 对自变量和因变量的处理
u0 = [1, 1]
t = np.linspace(0, 1, 100)

# 求解函数
solution = odeint(f, u0, t, tfirst=True)

# 作图
plt.plot(t, solution[:,0], label='x')
plt.plot(t, solution[:,1], label='y')
plt.legend()
plt.grid()
plt.xlim(0, 1)
plt.show()

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值