Sympy 'solve' returns 'list index out of range' 错误

Sympy 'solve' returns 'list index out of range' error

我正在使用 JuypterLab 尝试解决一个简单的代数问题:

3 * r**0.25 * s**0.75 = 14.086

我需要求解 r 值在 3 到 17 之间的 s。

import numpy as np
import pandas  
import sympy as sym
from sympy import symbols, solve




s = Symbol('s')

expr = 3 * 18**0.25 * s**0.75 = 14.086

sol = solve(expr)

num = sol[10]
num

当我 运行 代码时,我得到 list out of range error

我也试过了

s = Symbol('s')

expr = 3 * 18**0.25 * s**0.75

sol = solve(expr)
u = 14.086

num = sol[u]
num

当我 运行 这段代码时,我得到 list indices must be integers or slices, not float

我想为 r 的值找到 s 的值 3 and 17.

之间

关于第一个错误“当我 运行 代码时,我得到列表超出范围的错误”:

  • 这是因为 sol 是一个单元素列表,而您正试图访问不存在的第十个元素。

关于第二个错误“当我 运行 这段代码时,我得到的列表索引必须是整数或切片,而不是浮点数”

  • 这是因为要访问您尝试使用小数的列表的位置,这除了不起作用之外没有任何意义

至于sol的输出是[0.0]。

下面的代码不是您要找的吗?因为在我看来你想找出当 s 为 14.086 时表达式的输出,对吗?

import numpy as np
import pandas  
import sympy as sym
from sympy import Symbol, solve

s = Symbol('s')

expr = 3 * 18**0.25 * s**0.75

y = expr.replace(s, 14.086)
print(y)

相反,如果您想找到给定表达式值的 sol 的值,您可以使用这种方法

# equation example 3 + s, given an output of 5
y = solveset(Eq(3 + s, 5), s)
print(y)

sympy 中的方程是使用 Eq() 编写的。您可以使用这样的方程(或多个方程的列表)调用 solve。通过提供 s 作为第二个参数,您可以告诉 solve 您正在寻找给定 rs 的表达式。

solve 的结果可以采用几种不同的形式,具体取决于方程式。通常它是一个列表,在这种情况下只有一个表达式可以求解 s,因此是一个只有一个元素的列表。 (例如,一个二次方程可能有多个解。)

solve的结果往往不是一个数字,而是一个符号表达式。在本例中,它是一个涉及变量 r 的表达式。要为特定 r(例如 r=10)获取 s 的值,可以使用 expr.subs(r, 10)。有时解是数字,但仍然是符号形式(例如 sqrt(2))。调用 .evalf() 将给出一个完整的数字解。

from sympy import Symbol, solve, Eq, plot

r = Symbol('r')
s = Symbol('s')

equation = Eq(3 * r**0.25 * s**0.75, 14)
sol = solve(equation, s) # [7.79846345438935/r**(1/3)]
s_of_r = sol[0]
for ri in range(3, 18):
    si = s_of_r.subs(r, ri).evalf()
    print(f"for r={ri} the corresponding value for s={si:.6f}")

Sympy 也可以做一些基本的绘图:

plot(s_of_r, (r, 3, 17))