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
您正在寻找给定 r
的 s
的表达式。
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))
我正在使用 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
您正在寻找给定 r
的 s
的表达式。
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))