我想创建一个绘制二维微分方程组的函数,但是如果我使用2 * x + 3 * y之类的参数调用该函数,显然会遇到异常,因为我尚未定义在执行时x和y。
在代码中,我想做这样的事情:
import numpy as np
import matplotlib.pyplot as plt
def streamplot(xdot, ydot, xxrange, yyrange):
"""Displays the stream plot of a two-dimensional system of equations."""
x, y = np.meshgrid(np.arange(0,xxrange,1),np.arange(0,yyrange,1)
plt.streamplot(x, y, xdot, ydot)
plt.show()
,但显然xdot和ydot将取决于尚未分配的x和y。我认为应该可以捕获在函数执行时Python会创建的异常,并在那时创建这些变量,但是应该有一种更简单的方法,对吧?
答案 0 :(得分:1)
像xdot和ydot这样的外观是函数而不是变量。 您可以将函数作为参数传递给其他函数:
import math
def applyTwice (f, x):
return f (f (x))
print (applyTwice (math.sqrt, 16))
print (applyTwice (lambda x: 2 * x, 10))
'''
Output:
2.0
40
'''
答案 1 :(得分:0)
如果您尝试使用python描述数学方程,则可以尝试使用simpy:
from sympy import *
x = Symbol('x')
y = Symbol('y')
x+y+x-y
>>>2*x
您可以将xdot
和ydot
定义为简单符号。
此处有更多详细信息:https://www.scipy-lectures.org/advanced/sympy.html
答案 2 :(得分:0)
这里采用了雅克·德·豪格(Jacques de Hooge)在回答中和我在评论中所说的内容,但使之与您的代码更加相关。请注意,f
可以是从R ^ 2到R ^ 2的任何函数,并且可以传递给您的streamplot
函数。
import numpy as np
import matplotlib.pyplot as plt
def f(x, y):
return x + y, x*y
def streamplot(f, x_min=0, x_max=1, y_min=0, y_max=1,
x_num_divisions=100, y_num_divisions=100):
"""Displays the stream plot of a two-dimensional system of equations."""
x, y = np.meshgrid(
np.linspace(x_min, x_max, x_num_divisions),
np.linspace(y_min, y_max, y_num_divisions)
)
xdot, ydot = f(x, y)
plt.streamplot(x, y, xdot, ydot)
plt.show()
streamplot(f)