在Matlab中用数值方法绘制一阶非线性微分方程的解
Using numerical methods to plot solution to first-order nonlinear differential equation in Matlab
我有一个关于绘制 x(t) 的问题,知道 dx/dt 等于下面的表达式,以下微分方程的解。在 t = 0 时 x 的值为 0。
syms x
dxdt = -(1.0*(6.84e+45*x^2 + 5.24e+32*x - 2.49e+42))/(2.47e+39*x + 7.12e+37)
我想绘制这个一阶非线性微分方程的解。解析解涉及复数,所以这无关紧要,因为这个方程模拟了现实生活中的过程,但 Matlab 可以使用数值方法求解方程并绘制它。有人可以建议怎么做吗?
我已经编写了一个示例,说明如何将 Python 与 SymPy 和 matplotlib 一起使用。 SymPy 可用于计算定积分和不定积分。通过计算不定积分并添加一个常数以将其设置为在 t = 0 时计算为 0。现在您有了积分,所以只需要绘图即可。我会定义一个从起点到终点之间有 1000 个点(可能更少)的数组。然后,您可以计算每个时间点的积分值和常数,然后可以使用 matplotlib 绘制。关于如何使用 matplotlib 自定义绘图还有很多其他问题。
这显示函数 dxdt 的不定积分的基本图,假设 x(t) = 0。当 运行 Plotting()
时元组的变化将设置 x 值的范围情节。这设置为在调用函数时设置的最小值和最大值之间绘制 1000 个数据点。
关于自定义剧情的更多信息,我推荐matplotlib documentation. Documentation on the integral can be found in SymPy documentation。
import pandas as pd
from sympy import *
from sympy.abc import x
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
def Plotting(xValues, dxdt):
# Calculate integral
xt = integrate(dxdt,x)
# Convert to function
f = lambdify(x, xt)
C = -f(0)
# Define x values, last number in linspace corresponding to number of points to plot
xValues = np.linspace(xValues[0],xValues[1],500)
yValues = [f(x)+C for x in xValues]
# Initialize figure
fig = plt.figure(figsize = (4,3))
ax = fig.add_axes([0, 0, 1, 1])
# Plot Data
ax.plot(xValues, yValues)
plt.show()
plt.close("all")
# Define Function
dxdt = -(1.0*(6.84e45*x**2 + 5.24e32*x - 2.49e42))/(2.47e39*x + 7.12e37)
# Run Plotting function, with left and right most points defined as tuple, and function as second argument
Plotting((-0.025, 0.05),dxdt)
在 matlab 中试试这个
tspan = [0 10];
x0 = 0;
[t,x] = ode45(@(t,x) -(1.0*(6.84e+45*x^2 + 5.24e+32*x - 2.49e+42))/(2.47e+39*x + 7.12e+37), tspan, x0);
plot(t,x,'b')
我试了一下,我明白了
希望对你有帮助。
我有一个关于绘制 x(t) 的问题,知道 dx/dt 等于下面的表达式,以下微分方程的解。在 t = 0 时 x 的值为 0。
syms x
dxdt = -(1.0*(6.84e+45*x^2 + 5.24e+32*x - 2.49e+42))/(2.47e+39*x + 7.12e+37)
我想绘制这个一阶非线性微分方程的解。解析解涉及复数,所以这无关紧要,因为这个方程模拟了现实生活中的过程,但 Matlab 可以使用数值方法求解方程并绘制它。有人可以建议怎么做吗?
我已经编写了一个示例,说明如何将 Python 与 SymPy 和 matplotlib 一起使用。 SymPy 可用于计算定积分和不定积分。通过计算不定积分并添加一个常数以将其设置为在 t = 0 时计算为 0。现在您有了积分,所以只需要绘图即可。我会定义一个从起点到终点之间有 1000 个点(可能更少)的数组。然后,您可以计算每个时间点的积分值和常数,然后可以使用 matplotlib 绘制。关于如何使用 matplotlib 自定义绘图还有很多其他问题。
这显示函数 dxdt 的不定积分的基本图,假设 x(t) = 0。当 运行 Plotting()
时元组的变化将设置 x 值的范围情节。这设置为在调用函数时设置的最小值和最大值之间绘制 1000 个数据点。
关于自定义剧情的更多信息,我推荐matplotlib documentation. Documentation on the integral can be found in SymPy documentation。
import pandas as pd
from sympy import *
from sympy.abc import x
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
def Plotting(xValues, dxdt):
# Calculate integral
xt = integrate(dxdt,x)
# Convert to function
f = lambdify(x, xt)
C = -f(0)
# Define x values, last number in linspace corresponding to number of points to plot
xValues = np.linspace(xValues[0],xValues[1],500)
yValues = [f(x)+C for x in xValues]
# Initialize figure
fig = plt.figure(figsize = (4,3))
ax = fig.add_axes([0, 0, 1, 1])
# Plot Data
ax.plot(xValues, yValues)
plt.show()
plt.close("all")
# Define Function
dxdt = -(1.0*(6.84e45*x**2 + 5.24e32*x - 2.49e42))/(2.47e39*x + 7.12e37)
# Run Plotting function, with left and right most points defined as tuple, and function as second argument
Plotting((-0.025, 0.05),dxdt)
在 matlab 中试试这个
tspan = [0 10];
x0 = 0;
[t,x] = ode45(@(t,x) -(1.0*(6.84e+45*x^2 + 5.24e+32*x - 2.49e+42))/(2.47e+39*x + 7.12e+37), tspan, x0);
plot(t,x,'b')
我试了一下,我明白了
希望对你有帮助。