【问题标题】:Sympy 'solve' returns 'list index out of range' errorSympy“解决”返回“列表索引超出范围”错误
【发布时间】:2022-01-01 11:00:36
【问题描述】:

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

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

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

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之间。

【问题讨论】:

  • 查看几乎重复的问题和建议here

标签: python sympy


【解决方案1】:

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))

【讨论】:

    【解决方案2】:

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

    • 这是因为 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)
    

    【讨论】:

    • 感谢您的回复。您能推荐一种更好的方法来解决值s 的问题吗?
    • 我已经编辑了评论,为您可能正在寻找的可能的解决方案...
    • 所以你只需要 y = expr.replace(s, 14.086)y 将包含输出
    • 这是等式:3 * r**0.25 * s**0.75 = 14.086。我需要为 3 到 17 之间的 r 值求解 s。
    • 我添加了另一种方法,即在给定表达式值的情况下找出sol 的值。如果您遇到更多问题,这是一个很好的页面:docs.sympy.org/latest/tutorial/…
    猜你喜欢
    • 1970-01-01
    • 2015-04-27
    • 2022-01-20
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2017-10-30
    相关资源
    最近更新 更多