强制Sympy表达式包含符号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了强制Sympy表达式包含符号相关的知识,希望对你有一定的参考价值。

我在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]]

也就是说,我不确定你赢了什么,而不是简单地使用plot_implicit直接在sys的方程式。考虑到你获得的不同解决方案将具有不同的定义域,因为曲线转向或横向(抛物线等)。策划所有这些作品会很头疼。

以下是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()

nullclines

以上是关于强制Sympy表达式包含符号的主要内容,如果未能解决你的问题,请参考以下文章

使用python的sympy解符号方程组后,如何将结果带入之后的符号表达式

python系列22:sympy概述

Python圈中的符号计算库-Sympy(转载)

如何传递用于scipy的sympy表达式?

使用sympy进行表达式化简

python sympy evalf()函数