Python 使用SymPy的程序出错
我想用Symphy软件包来求一个四阶多项式方程的根。随后,我想将这些根绘制为多项式方程参数的函数。我已经写了下面的代码。它似乎可以很好地计算所有的东西,但我无法绘制结果,因为我得到了错误“x和y的维数不相同”。我想这与我对Symphy的使用有关,因为通常它都是这样工作的Python 使用SymPy的程序出错,python,sympy,Python,Sympy,我想用Symphy软件包来求一个四阶多项式方程的根。随后,我想将这些根绘制为多项式方程参数的函数。我已经写了下面的代码。它似乎可以很好地计算所有的东西,但我无法绘制结果,因为我得到了错误“x和y的维数不相同”。我想这与我对Symphy的使用有关,因为通常它都是这样工作的 from sympy import * from math import * from numpy import * import pylab as lab def Root
from sympy import *
from math import *
from numpy import *
import pylab as lab
def RootFunc(root, m, c0, r, En):
A = 2*(m**2 - 0.25 - c0**2)/r**2 + 4
B = 8*En*c0/r
C = -4 - 4*En**2 + ((c0**2 + m**2 -.25)/r**2 + 2)**2
return root.subs([(a,A),(b,B),(c,C)])
# Define necessary symbols
x = symbols('x')
a, b, c = symbols('a b c')
En, r = symbols("En r")
# Fix constants
m = 0
c0 = -2
# Solve equation
eq = x**4 + a*x**2 + b*x + c
sol = solve(eq,x)
root1 = sol[0]
grid = linspace(1,10,10)
sol1 = [RootFunc(root1, m, c0, r, .5) for r in grid]
lab.figure(1)
lab.plot(grid,sol1)
lab.show()
你确定你的脚本和你给我们的一样吗 我之所以这样说,是因为我可以逐字复制和粘贴您的示例,而且它完全没有问题 检查完毕后,请发布您正在使用的Python、SymPy、NumPy和Matplotlib的版本 编辑:我认为,当您提交第一个最小工作示例(MWE)时,在翻译过程中有些东西稍微丢失了。MWE中的解决方案是实值的,因此它与实际程序没有相同的问题。然而,关于解决方案: 你的主要问题是这一行
sol1 = [RootFunc(root1, m, c0, help, .5) for help in grid]
RootFunc
在本例中,返回一个sympy.core.add.add
,该pylab
没有概念,因此无法打印。在MWE中,您认识到这就是问题所在,并尝试调用返回值上的N()
和real()
。不幸的是,这只是将sympy.core.add.add
对象包装在一个NumPy数组中。当Pylab试图绘制此数组时,它会找到一个它没有概念的sympy.core.add.add
对象,因此只会抛出一个错误
幸运的是,SymPy允许您使用int()
、float()
或complex()将SymPy.core.add.add
对象转换为数字。因为你的根是复杂的,你应该在返回值上使用complex()
,然后使用.real
获得真正的组件
所以,为了让它工作起来,你应该把上面的一行改为
sol1 = [complex(RootFunc(root1, m, c0, help, .5)).real for help in grid]
Edit2:简单介绍一下风格。您在代码中使用了大量通配符导入(例如,numpy import*
中的),如果您是唯一一个使用代码的人,这很好,毕竟会使代码更整洁
但是,如果你要在这样的论坛上发帖,请尝试使用合格的导入(就像你为pylab
所做的那样),这样我们就不必费力地阅读所有模块的文档来尝试并弄清楚你在做什么
还有一件事:当您遇到这样的问题时,在python shell中逐行执行它并检查变量的类型(使用type()
)和值(使用print()
或repr()
)。为此,我强烈建议您学习如何使用,因为它确实有帮助。您确定您正在运行您在这里给我们的相同脚本吗
我之所以这样说,是因为我可以逐字复制和粘贴您的示例,而且它完全没有问题
检查完毕后,请发布您正在使用的Python、SymPy、NumPy和Matplotlib的版本
编辑:我认为,当您提交第一个最小工作示例(MWE)时,在翻译过程中有些东西稍微丢失了。MWE中的解决方案是实值的,因此它与实际程序没有相同的问题。然而,关于解决方案:
你的主要问题是这一行
sol1 = [RootFunc(root1, m, c0, help, .5) for help in grid]
RootFunc
在本例中,返回一个sympy.core.add.add
,该pylab
没有概念,因此无法打印。在MWE中,您认识到这就是问题所在,并尝试调用返回值上的N()
和real()
。不幸的是,这只是将sympy.core.add.add
对象包装在一个NumPy数组中。当Pylab试图绘制此数组时,它会找到一个它没有概念的sympy.core.add.add
对象,因此只会抛出一个错误
幸运的是,SymPy允许您使用int()
、float()
或complex()将SymPy.core.add.add
对象转换为数字。因为你的根是复杂的,你应该在返回值上使用complex()
,然后使用.real
获得真正的组件
所以,为了让它工作起来,你应该把上面的一行改为
sol1 = [complex(RootFunc(root1, m, c0, help, .5)).real for help in grid]
Edit2:简单介绍一下风格。您在代码中使用了大量通配符导入(例如,numpy import*
中的),如果您是唯一一个使用代码的人,这很好,毕竟会使代码更整洁
但是,如果你要在这样的论坛上发帖,请尝试使用合格的导入(就像你为pylab
所做的那样),这样我们就不必费力地阅读所有模块的文档来尝试并弄清楚你在做什么
还有一件事:当您遇到这样的问题时,在python shell中逐行执行它并检查变量的类型(使用type()
)和值(使用print()
或repr()
)。为此,我强烈建议您学习如何使用,因为它确实有帮助。您的导入可能会破坏一些东西。你能试试这个吗
import sympy as sy
import numpy as np
import pylab as lab
def RootFunc(root, A, B):
return root.subs([(a,A),(b,B)])
# Define necessary symbols
x = sy.symbols('x')
a, b = sy.symbols('a b')
# Solve equation
eq = x**4 + a*x**2 + b*x
sol = sy.solve(eq,x)
root1 = sol[1] # first element is trivial solution, so take second one
grid = np.linspace(1,10,10)
sol1 = [np.real(sy.N(RootFunc(root1, 1, x))) for x in grid]
lab.figure(1)
lab.plot(grid,sol1)
lab.show()
你可能会破坏一些东西与你的进口。你能试试这个吗
import sympy as sy
import numpy as np
import pylab as lab
def RootFunc(root, A, B):
return root.subs([(a,A),(b,B)])
# Define necessary symbols
x = sy.symbols('x')
a, b = sy.symbols('a b')
# Solve equation
eq = x**4 + a*x**2 + b*x
sol = sy.solve(eq,x)
root1 = sol[1] # first element is trivial solution, so take second one
grid = np.linspace(1,10,10)
sol1 = [np.real(sy.N(RootFunc(root1, 1, x))) for x in grid]
lab.figure(1)
lab.plot(grid,sol1)
lab.show()
我发现了一个错误。显然,行“[real(N(RootFunc(root1,1,grid)),表示网格中的网格]”将网格从数组更改为一个数字。但是,如果我将其替换为“[real(N(RootFunc(root1,1,help)),以获取网格中的帮助]”,则会得到不同的错误。有什么想法吗?首先,你发现了什么错误?第二,在绘图之前,你能告诉我们你的sol1
值是多少吗?我已经编辑了我的帖子来显示我未修改的程序。也许你可以试试,如果它对你有用吗?我已经更新了我的答案,让我知道我是否