强制 Sympy 表达式包含一个符号
Force a Sympy expression to contain a symbol
我在 python3 中编写了以下代码(目的是计算然后绘制二维动态系统的 nullclines):
import sympy as sm
x1, x2 = sm.symbols('x1 x2')
x = [x1, x2]
sys = sm.Matrix([(x1 - sm.log(x2))*(x2-x1*x1),
x2**2 - 4])
solutions = list(map(lambda dx: sm.solve(sm.Eq(dx, 0)), sys))
print(solutions)
我看到的是
[[{x1: -sqrt(x2)}, {x1: sqrt(x2)}, {x1: log(x2)}], [-2, 2]]
这个[-2,2]给了我一个大问题,因为我接下来要画出解决方案。因为我想使用 sys
无论每个元素是否包含两个变量。我想遍历字典并绘制 sm.Eq(list(solutions[i][j].keys())[0], list(solutions[i][j].values())[0])
但我不能保证像这样的字典
我看到如果我将 + x1 - sm.log(sm.exp(x1))
添加到 sys[1]
它将给我一致的字典形式,但是有没有办法让我强制 sys
' 元素包含两者以更优雅的方式?我不想查看每个元素的两个坐标,如果不存在则向其添加冗余表达式
参数 dict=True
就是这样做的。使用 sm.solve(sm.Eq(dx, 0), dict=True)
代码的输出是
[[{x1: -sqrt(x2)}, {x1: sqrt(x2)}, {x1: log(x2)}], [{x2: -2}, {x2: 2}]]
就是说,与直接在 sys
中的方程式上简单地使用 plot_implicit
相比,我不确定您是否会赢得任何东西。考虑到您获得的不同解决方案将具有不同的定义域,因为曲线转向或侧向(抛物线等)。绘制所有这些片段会很头疼。
以下是它如何与 plot_implicit
一起使用
import sympy as sm
x1, x2 = sm.symbols('x1 x2')
eqs = [(x1 - sm.log(x2))*(x2-x1*x1), x2**2 - 4]
window = [(x1, -3, 3), (x2, -3, 3)]
plots = [plot_implicit(eq, *window, show=False) for eq in eqs]
combined_plots = plots[0]
for k in range(1, len(plots)):
combined_plots.extend(plots[k])
combined_plots.show()
我在 python3 中编写了以下代码(目的是计算然后绘制二维动态系统的 nullclines):
import sympy as sm
x1, x2 = sm.symbols('x1 x2')
x = [x1, x2]
sys = sm.Matrix([(x1 - sm.log(x2))*(x2-x1*x1),
x2**2 - 4])
solutions = list(map(lambda dx: sm.solve(sm.Eq(dx, 0)), sys))
print(solutions)
我看到的是
[[{x1: -sqrt(x2)}, {x1: sqrt(x2)}, {x1: log(x2)}], [-2, 2]]
这个[-2,2]给了我一个大问题,因为我接下来要画出解决方案。因为我想使用 sys
无论每个元素是否包含两个变量。我想遍历字典并绘制 sm.Eq(list(solutions[i][j].keys())[0], list(solutions[i][j].values())[0])
但我不能保证像这样的字典
我看到如果我将 + x1 - sm.log(sm.exp(x1))
添加到 sys[1]
它将给我一致的字典形式,但是有没有办法让我强制 sys
' 元素包含两者以更优雅的方式?我不想查看每个元素的两个坐标,如果不存在则向其添加冗余表达式
参数 dict=True
就是这样做的。使用 sm.solve(sm.Eq(dx, 0), dict=True)
代码的输出是
[[{x1: -sqrt(x2)}, {x1: sqrt(x2)}, {x1: log(x2)}], [{x2: -2}, {x2: 2}]]
就是说,与直接在 sys
中的方程式上简单地使用 plot_implicit
相比,我不确定您是否会赢得任何东西。考虑到您获得的不同解决方案将具有不同的定义域,因为曲线转向或侧向(抛物线等)。绘制所有这些片段会很头疼。
以下是它如何与 plot_implicit
import sympy as sm
x1, x2 = sm.symbols('x1 x2')
eqs = [(x1 - sm.log(x2))*(x2-x1*x1), x2**2 - 4]
window = [(x1, -3, 3), (x2, -3, 3)]
plots = [plot_implicit(eq, *window, show=False) for eq in eqs]
combined_plots = plots[0]
for k in range(1, len(plots)):
combined_plots.extend(plots[k])
combined_plots.show()