【问题标题】:Why sympy can't calculate?为什么sympy不能计算?
【发布时间】:2021-03-27 07:36:38
【问题描述】:
    import sympy as sp
import matplotlib.pyplot as plt

# set
Cd = 0.25
g = 9.81
pf = 10**(-6)  # Perturbation Fraction
t = 4
v = 36
xr = [int(input('initial guess : '))]
i = 0
Ea = 1
Es = 0.01

# 함수 정의
def f(m):
    return sp.sqrt(g * m / Cd) * sp.tanh(sp.sqrt(g * Cd / m) * t) - v

# real root
x = sp.Symbol('x')
ans = sp.solve(f(x))  # sp.solve()로 해 구하기
print(ans)

我想得到 f(x) 的真正根。 但是这段代码对于 #real root 有一些问题 我想不通

【问题讨论】:

    标签: python sympy


    【解决方案1】:

    你不应该期望 sympy 创造奇迹。除了相对简单的符号操作之外,sympy 只是卡住了,有时甚至返回错误的答案。您必须求助于 Maple 或 Mathematica 等商业工具才能破解难题。

    在大多数实际情况下,您的替代方法是使用 scipy 并获得一个好的数值解,这是您大部分时间想要的,而不是封闭形式的解。

    【讨论】:

      【解决方案2】:

      Sympy 是一个符号数学库,试图找到精确的符号解。因此,它不适用于浮点数,因为它们必然是不精确的。

      如果您的方程是全数字的,通常建议使用数字库,例如 numpy 和 scipy。如果您已经在进行符号操作(例如计算微分),则 sympy 提供 nsolve 调用数字求解器。因此,它还需要一个种子来开始其数字搜索。在您的情况下,它看起来像:

      # ....
      xr = 1
      ans = sp.nsolve(f(x), xr)
      

      结果:142.737633108449

      Sympy 也有一种方法可以将 sympy 函数转换为 numpy 格式(在 numpy 中工作得更快,但没有符号表达式)。 sp.lambdify(x, f(x)) 创建了这样一个 numpy 函数。以下是您的示例的外观:

      import matplotlib.pyplot as plt
      import numpy as np
      
      f_np = sp.lambdify(x, f(x))
      xi = np.linspace(1, 1000, 2000)
      plt.plot(xi, f_np(xi))
      

      在交互环境下,可以add a question mark显示函数的numpy源码:

      >>> f_np?
      Signature: f_np(x)
      Docstring:
      Created with lambdify. Signature:
      func(x)
      Expression:
      6.26418390534633*sqrt(x)*tanh(6.26418390534633*sqrt(1/x)) - 36
      Source code:
      def _lambdifygenerated(x):
          return (6.26418390534633*sqrt(x)*tanh(6.26418390534633*sqrt(x**(-1.0))) - 36)
      

      【讨论】:

      • 所有参数都应该声明为符号而不是浮点常量。然后可以尝试求解方程(如前所述,这可能会失败)。
      【解决方案3】:

      如果您查看 f(x) 的表达式,您会发现它是高度非线性的(如 JoahnC 向您展示的图中所示):

      6.26418390534633*sqrt(x)*tanh(6.26418390534633*sqrt(1/x)) - 36
      

      SymPy 无法为没有此类解决方案的事物提供分析解决方案。但是,它可以给出单变量表达式的数值近似值。这就是nsolve 的用途。它需要对解决方案进行初步猜测(正如您通过询问 xr 所期望的那样)。

      >>> sp.nsolve(f(x), 100)
      142.737633108449
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-29
        • 2020-07-09
        • 1970-01-01
        • 2020-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多