【问题标题】:ValueError: Could not find root within given tolerance.How to solve?ValueError:在给定的容差范围内找不到根。如何解决?
【发布时间】:2022-06-10 23:51:52
【问题描述】:

我正在尝试使用“nsolve”函数求解这个方程。不幸的是,出现了这个错误:

ValueError: Could not find root within given tolerance. (435239733.760000060718 > 2.16840434497100886801e-19)
Try another starting point or tweak arguments.

代码是:

import sympy

d=[0.3, 32.6, 33.4, 241.7, 396.2, 444.4, 480.8, 588.9, 1043.9, 1136.1, 1288.1, 1408.1, 1439.4, 1604.8]
N=len(d)
x = sympy.Symbol('x', real=True)
expr2 = sympy.Eq(d[13] + N * sympy.Pow(x, -1) - N * d[13] * sympy.Pow(1 - sympy.exp(-d[13] * N), -1), 0)
expr_2 = sympy.simplify(expr=expr2)
solution = sympy.nsolve(expr_2, -0.01)
s = round(solution, 6)
print(s)

【问题讨论】:

    标签: python math sympy equation exponential


    【解决方案1】:

    您尝试解决的系统会导致大量导数和非常突然的变化,包括x == 0 处的奇点。这是方程的图形(使用 Mathematica)。

    数值求解器难以处理这些函数,因为它们中的大多数都假设解具有一定程度的平滑性,并且可能会因奇异点而感到困惑。几乎所有这些(我指的是一般的求解器,而不仅仅是 SymPy)都受益于正则化或问题的重新表述。

    我建议通过将两边都乘以 x 来简化方程,这将消除除以 x 并导致更平滑的函数(在这种情况下为线性),数值求解器的行为正确。

    通过这种重新表述,您应该会发现解决方案是0.000671064

    此外,我还建议重新调整系数,使它们都在[-1,1] 中。这通常也有助于求解器。在你的情况下,它很容易找到解决方案,因为它是线性的,但更复杂的方程可能会导致问题。

    【讨论】:

    • 谢谢美人,je suis très reconnaissant。
    【解决方案2】:

    在这种情况下,谁能像您在其他方程中那样找到近似解?我试图通过像你之前做的那样将两边都乘以 x 来简化方程,但是没有用。有什么建议吗?谢谢你。 代码是

    导入同情

    d=[0.3, 32.6, 33.4, 241.7, 396.2, 444.4, 480.8, 588.9, 1043.9, 1136.1, 1288.1, 1408.1, 1439.4, 1604.8]

    N = len(d)

    cl = list()

    tot = sum(d)

    打印(总)

    x = sympy.Symbol('x', real=True)

    expr2 = sympy.Eq(tot + N * sympy.Pow(x, -1) - N * d[N-1] * sympy.Pow(1 - sympy.exp(-d[N-1]* x ), -1), 0)

    expr_2 = sympy.simplify(expr=expr2)

    solution = sympy.nsolve(expr_2, -0.01)

    s = round(solution, 8)

    打印

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 2022-12-04
      • 2020-02-29
      • 1970-01-01
      • 2020-03-12
      • 2021-02-11
      • 2021-11-09
      相关资源
      最近更新 更多