【问题标题】:Having trouble with using sympy subs command when trying to solve a function at an x value of 0尝试求解 x 值为 0 的函数时使用 sympy subs 命令时遇到问题
【发布时间】:2019-11-12 17:51:07
【问题描述】:

我有一个函数 [ -4*x/sqrt(1 - (1 - 2*x^2)^2) + 2/sqrt(1 - x^2) ] 我需要在 x=0 处进行评估.但是,每当您绘制此函数时,对于某个 y 区间,在 x=0 处有许多 y 值。这让我认为 (subs) 命令只能返回一个 y 值。对此有任何帮助或详细说明吗?谢谢!

如果有帮助,这是我的代码:

x = symbols('x')    
f = 2*asin(x)        # f(x) function
g = acos(1-2*x**2)   # g(x) function
eq = diff(f-g)       # evaluating the derivative of f(x) - g(x)
eq.subs(x, 0)        # substituting 0 for x in the derivative of f(x) - g(x)

运行代码后,它返回 NaN,我认为这是因为用 0 代替 x 返回的不是单个数字,而是一个数字范围。

Here is the graph of the function to be evaluated at x=0:

【问题讨论】:

  • limit(eq, x, 0, '-') 给出 4。limit(eq, x, 0, '+') 似乎永远运行...
  • diff(g).subs(x, e) 接近+/- 2,因为e 从任一侧接近0
  • wolfram alpha 将 0 作为右侧的限制,将 4 作为左侧的限制。 SymPy 似乎很困惑。
  • 如果表达式中的替换结果为0/0,则返回nan。

标签: python sympy substitution


【解决方案1】:

你应该总是给 SymPy 尽可能多的假设。例如,它无法从sqrt 中提取x**2,因为它认为x 很复杂。

分解然后化简解决了这个问题。 SymPy 无法在eq = A + B 上执行 L'Hopital,因为它不知道 A 和 B 都收敛。所以你必须通过将分数放在一起然后简化来引导它:

from sympy import *

x = symbols('x', real=True)
f = 2*asin(x)        # f(x) function
g = acos(1-2*x**2)   # g(x) function
eq = diff(f-g)       # evaluating the derivative of f(x) - g(x)
eq = simplify(factor(eq))
print(eq)

print(limit(eq, x, 0, "+"))
print(limit(eq, x, 0, "-"))

输出:

(-2*x + 2*Abs(x))/(sqrt(1 - x**2)*Abs(x))
0
4

simplifyfactorexpand 创造奇迹。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 2020-02-28
    • 2017-10-09
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多