我试着用sympy.diff
计算一个导函数,然后求解这个函数中的'x'
,让导函数func(x) = 0
的根。然而,求解这个导数函数非常慢,因为它返回五个解,但我只需要最接近固定值x0
的解。
import sympy
def diff_dist_func(a, b, c):
x = sympy.Symbol('x')
x0 = sympy.Symbol('x0')
y0 = sympy.Symbol('y0')
dist = ((x - x0) ** 2 + (a * x ** 3 + b * x ** 2 + c * x - y0) ** 2) ** (1 / 2)
return sympy.diff(dist, x)
a = -0.00020129919480721813
b=0.10107634020780536
c=-12.305150031126267
shortest_dist = diff_dist_func(a, b, c)
x0=252.3007982720215
y0=96.55526056735049
solve_shortest_dist = shortest_dist.evalf(subs={'x0': x0, 'y0': y0}) # build the derivative function
solve_x = sympy.solve(solve_shortest_dist, sympy.Symbol('x'), simplify=False, rational=False) # Here solve the derivative function is very slow.
为了加快求解速度,我尝试使用scipy.optimize.fsolve
,它能够给予func(x) = 0
的根的初始估计值x0
。因此,我将sympy.solve
替换为fsolve(solve_shortest_dist, np.array([x0]))
,但出现错误TypeError: 'Mul' object is not callable
。如何从sympy.diff的输出中提取导数函数,使其能够通过scipy.optimize.fsolve
求解?或者有什么方法可以加快解决过程?
1条答案
按热度按时间swvgeqrz1#
我使用的是SymPy 1.12,
solve
非常快,现在不需要转向数值库:注意复杂的解决方案。让我们计算错误wrt
x0
:最后,提取最接近
x0
的解: