【问题标题】:Sympy cannot solve my equation and gets stuckSympy 无法解出我的方程式并卡住了
【发布时间】:2021-05-21 15:30:06
【问题描述】:

我有一个简单的方程式,试图解决使用符号的问题,但是代码卡住了,我没有得到错误让我调试。我怎样才能正确地做到这一点?

from sympy import *

from sympy import init_printing
init_printing(use_latex = True)
import sympy as sp
from numpy import random
import numpy as np
import math

from decimal import *

timeS = symbols("t")

eq1 =  Eq( (-4221.4125*exp(-2750.0*timeS)*sin(6514.4071*timeS) + 10000.0*exp(-2750.0*timeS)*cos(6514.4071*timeS)),8000)
T_off = solve(eq1,  timeS  )[0]
display("T_off = ",T_off)

【问题讨论】:

    标签: sympy symbols solver


    【解决方案1】:

    您的方程式看起来没有解析解,因此您应该改用nsolve-0.0010 之间有一个根,所以 bisect 方法给出:

    In [59]: nsolve(eq1, timeS, [-0.001, 0])
    Out[59]: 3.46762014687136e-5
    

    【讨论】:

    • 我不知道您可以通过仅使用范围进行猜测来选择二等分——这很好。但它不应该——如果使用二分法——给出一个超出猜测范围的根。
    • 感谢您回答我的问题,我无法找到有关 nsolve 的信息,您能指出我正确的方向吗?另外你为什么说在 -0.001 和 0 之间有一个根,但求解器在 0 和 0.001 之间找到了答案?
    • 哦,我没有注意到根目录超出范围。我想那也有一个正根
    【解决方案2】:

    这是一个不适定方程。通过将两边除以10**4 来重新缩放并将timeS 替换为Symbol(x)/10**4 并使用nsolve

    >>> eq2 = eq1.func(eq1.lhs/10**4, eq1.rhs/10**4).subs(timeS, symbols('x')/10**4)
    >>> from sympy import nsolve
    >>> nsolve(eq2,0)
    0.346762014687135
    

    所以timeS ~= 0.35e-4sqrt 函数会自动缩放总和,因此 sqrt(eq1.rewrite(Add)) 会将项的系数减小到小于 1 的值,但目前这种简化不是 SymPy 对一般表达式的简化的一部分。

    【讨论】:

    • 感谢您回答我的问题,您是如何如此迅速地确定方程不成立的?而且我不明白您为什么提到 sqrt 我没有将其视为您解决方案的一部分。另外,您如何确定将两边重新缩放 10**4 而不是 5 或 6 的幂?再次感谢
    • 缩放只是帮助您使用更接近 1 的数字进行猜测——实际值无关紧要。绘制sin(1000*x)sin(x) 并考虑尝试在0 右侧找到最大值。求解器通常具有用于测试函数的默认设置,假设它在您正在测试的区域中变化不会太快。然而,即使二等分也会遇到缩放问题,因为它必须决定答案何时足够接近于零。
    猜你喜欢
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2018-05-14
    • 2020-07-16
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2021-02-25
    相关资源
    最近更新 更多