首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sympy TypeError使用solve将变量表示为其他变量

Sympy TypeError使用solve将变量表示为其他变量
EN

Stack Overflow用户
提问于 2018-09-27 18:06:54
回答 1查看 86关注 0票数 1

根据我在网上找到的一些example,我可以这样做:

代码语言:javascript
复制
from sympy import var
from sympy import solve

Ldy, Ldz = var('Ldy Ldz')
g, x, y, z = var('g x y z')
xZ, yZ, zZ = var('xZ yZ zZ')
xdd, ydd, zdd = var('xdd ydd zdd')

E1 = z * xdd + (xZ - x) * (g + zdd)
E2 = z * ydd + (yZ - y) * (g + zdd) - Ldy
E3 = -y * xdd + x * ydd - zZ * (g + zdd) + Ldz

out = solve([E1, E2, E3], [xdd, ydd, Ldy])

print(type(xdd))
print("xdd = ", (out[xdd]).factor())

这会产生xdd = (g + zdd)*(x - xZ)/z

现在,为了我自己的方程式这样做:

代码语言:javascript
复制
from sympy import symbols, solve

x, y, z, k12, k26, x0 = symbols("x, y, z, k12, k26, x0")
symbols = x, y, z, k12, k26, x0

eq1 = k12 * x**2 -y
eq2 = k26 * y**3 - z
eq3 = x * 2*y + 6*z - x0

out = solve([eq1, eq2, eq3], [x,y,z])
print("x = ", (out[x]).factor())

而是给出TypeError: list indices must be integers or slices, not Symbol

我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2018-09-27 21:31:34

问题是solve有多种返回类型:有时返回一个列表,有时返回一个字典,有时返回一个字典列表。输出形式取决于要求解的方程的细节:变量数量,解的数量。这意味着应该使用list=Truedict=True来强制从solve获得一致的输出。注意,dict=True意味着输出是一个字典列表,因为可能存在多个解决方案--这里就是这种情况。在您的示例中:

代码语言:javascript
复制
out = solve([eq1, eq2, eq3], [x,y,z], dict=True)
for sol in out:
    print("x = ", sol[x].factor())

打印

代码语言:javascript
复制
x =  18**(1/3)*((3*x0 - sqrt(6*k12*k26*x0 + 1)/(k12*k26) + 1/(k12*k26))/k26)**(2/3)*(sqrt(6*k12*k26*x0 + 1) + 1)/(18*k12*x0)
x =  -18**(1/3)*((3*x0 + sqrt(6*k12*k26*x0 + 1)/(k12*k26) + 1/(k12*k26))/k26)**(2/3)*(sqrt(6*k12*k26*x0 + 1) - 1)/(18*k12*x0)
x =  -2**(1/3)*((3*x0 - sqrt(6*k12*k26*x0 + 1)/(k12*k26) + 1/(k12*k26))/k26)**(2/3)*(3**(2/3) - 3*3**(1/6)*I)*(sqrt(6*k12*k26*x0 +1) + 1)/(36*k12*x0)
x =  -2**(1/3)*((3*x0 - sqrt(6*k12*k26*x0 + 1)/(k12*k26) + 1/(k12*k26))/k26)**(2/3)*(3**(2/3) + 3*3**(1/6)*I)*(sqrt(6*k12*k26*x0 +1) + 1)/(36*k12*x0)
x =  2**(1/3)*((3*x0 + sqrt(6*k12*k26*x0 + 1)/(k12*k26) + 1/(k12*k26))/k26)**(2/3)*(3**(2/3) - 3*3**(1/6)*I)*(sqrt(6*k12*k26*x0 + 1) - 1)/(36*k12*x0)
x =  2**(1/3)*((3*x0 + sqrt(6*k12*k26*x0 + 1)/(k12*k26) + 1/(k12*k26))/k26)**(2/3)*(3**(2/3) + 3*3**(1/6)*I)*(sqrt(6*k12*k26*x0 + 1) - 1)/(36*k12*x0)

由于这个原因和其他原因,SymPy开发人员建议使用solveset and its relatives而不是solve。具体来说,nonlinsolve可以在这里使用:

代码语言:javascript
复制
out = nonlinsolve([eq1, eq2, eq3], [x,y,z])
for sol in out:
    print("x = ", sol[x].factor())

哪种打印

代码语言:javascript
复制
x =  -18**(1/3)*((3*x0 + sqrt(6*k12*k26*x0 + 1)/(k12*k26) + 1/(k12*k26))/k26)**(2/3)*(sqrt(6*k12*k26*x0 + 1) - 1)/(18*k12*x0)
x =  18**(1/3)*((3*x0 - sqrt(6*k12*k26*x0 + 1)/(k12*k26) + 1/(k12*k26))/k26)**(2/3)*(sqrt(6*k12*k26*x0 + 1) + 1)/(18*k12*x0)
x =  2**(1/3)*((3*x0 + sqrt(6*k12*k26*x0 + 1)/(k12*k26) + 1/(k12*k26))/k26)**(2/3)*(3**(2/3) - 3*3**(1/6)*I)*(sqrt(6*k12*k26*x0 + 1) - 1)/(36*k12*x0)
x =  2**(1/3)*((3*x0 + sqrt(6*k12*k26*x0 + 1)/(k12*k26) + 1/(k12*k26))/k26)**(2/3)*(3**(2/3) + 3*3**(1/6)*I)*(sqrt(6*k12*k26*x0 + 1) - 1)/(36*k12*x0)
x =  -2**(1/3)*((3*x0 - sqrt(6*k12*k26*x0 + 1)/(k12*k26) + 1/(k12*k26))/k26)**(2/3)*(3**(2/3) + 3*3**(1/6)*I)*(sqrt(6*k12*k26*x0 +1) + 1)/(36*k12*x0)
x =  -2**(1/3)*((3*x0 - sqrt(6*k12*k26*x0 + 1)/(k12*k26) + 1/(k12*k26))/k26)**(2/3)*(3**(2/3) - 3*3**(1/6)*I)*(sqrt(6*k12*k26*x0 +1) + 1)/(36*k12*x0)

solveset及其相关对象的返回类型始终是SymPy集。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52534507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档