SymPy未使用子函数计算指数函数



我正试图在Python中编写多元Newton-Raphson方法的实现。为了开始,我正在尝试解决系统:

10 * x + 3 * y * y - 3
x * x - exp(y) - 2

尽管我打算将其扩展到任何任意的m x n系统(当然,假设解决方案是可能的/存在的(。

我的代码如下:

from dataclasses import dataclass
from sympy import *
x, y, z = symbols('x y z')

@dataclass
class Solve:
@staticmethod
def newton_raphson():
F = Matrix([10 * x + 3 * y * y - 3, x * x - exp(y) - 2])
v = Matrix([x, y])
print(J := F.jacobian(v))
print(J * -1)
xx, yy = 0, 0
for i in range(10):
A = J.subs({"x": xx, "y": yy})
b = F.subs({"x": xx, "y": yy})
update = linsolve((A, b), [x, y])
(xx, yy) = tuple(*update) # should be adding, not setting equal to
print(xx, yy)


mySolver = Solve
mySolver.newton_raphson()

我的问题是,当我对矩阵FJ执行.subs()时,除了之外,所有都是指数函数。也就是说,print(xx, yy)行打印:

3*(573 - 50*exp(3))/(20*(27 - 25*exp(3))) 5*(13 + 20*exp(3))/(4*(-27 + 25*exp(3)))
(-28650000*exp(1755/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 1075*exp(3)/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 9) - 7500000*exp(625*exp(6)/(-1350*exp(3) + 729 + 625*exp(6)) + 9) - 53550000*exp(625*exp(6)/(-1350*exp(3) + 729 + 625*exp(6)) + 6) - 105598890*exp(625*exp(6)/(-1350*exp(3) + 729 + 625*exp(6))) + 92498679*exp(5*(351 + 215*exp(3))/(4*(-1350*exp(3) + 729 + 625*exp(6)))) + 164313360*exp(1755/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 1075*exp(3)/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 3) + 15235500*exp(1755/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 1075*exp(3)/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 6) + 164358750*exp(625*exp(6)/(-1350*exp(3) + 729 + 625*exp(6)) + 3))/(-81000000*exp(625*exp(6)/(-1350*exp(3) + 729 + 625*exp(6)) + 6) - 107010000*exp(1755/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 1075*exp(3)/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 6) - 31492800*exp(625*exp(6)/(-1350*exp(3) + 729 + 625*exp(6))) + 72404280*exp(5*(351 + 215*exp(3))/(4*(-1350*exp(3) + 729 + 625*exp(6)))) + 38032200*exp(1755/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 1075*exp(3)/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 3) + 87480000*exp(625*exp(6)/(-1350*exp(3) + 729 + 625*exp(6)) + 3) + 9000000*exp(1755/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 1075*exp(3)/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 9) + 25000000*exp(625*exp(6)/(-1350*exp(3) + 729 + 625*exp(6)) + 9)) (-16200000*exp(625*exp(6)/(-1350*exp(3) + 729 + 625*exp(6)) + 6) - 40086000*exp(1755/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 1075*exp(3)/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 6) - 68751693*exp(5*(351 + 215*exp(3))/(4*(-1350*exp(3) + 729 + 625*exp(6)))) - 6298560*exp(625*exp(6)/(-1350*exp(3) + 729 + 625*exp(6))) + 17496000*exp(625*exp(6)/(-1350*exp(3) + 729 + 625*exp(6)) + 3) + 68874390*exp(1755/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 1075*exp(3)/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 3) + 10450000*exp(1755/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 1075*exp(3)/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 9) + 5000000*exp(625*exp(6)/(-1350*exp(3) + 729 + 625*exp(6)) + 9))/(8*(-2025000*exp(625*exp(6)/(-1350*exp(3) + 729 + 625*exp(6)) + 6) - 2675250*exp(1755/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 1075*exp(3)/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 6) - 787320*exp(625*exp(6)/(-1350*exp(3) + 729 + 625*exp(6))) + 1810107*exp(5*(351 + 215*exp(3))/(4*(-1350*exp(3) + 729 + 625*exp(6)))) + 950805*exp(1755/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 1075*exp(3)/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 3) + 2187000*exp(625*exp(6)/(-1350*exp(3) + 729 + 625*exp(6)) + 3) + 225000*exp(1755/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 1075*exp(3)/(4*(-1350*exp(3) + 729 + 625*exp(6))) + 9) + 625000*exp(625*exp(6)/(-1350*exp(3) + 729 + 625*exp(6)) + 9)))
...etc

虽然我需要一个严格的数值,用于更新猜测xxyy

Sympy专门从事符号评估。exp(3(是一个无理数,因此不能用数字表示。Sympy知道这一点。

要强制进行数值近似,可以使用sympy中的N函数,如中所示

A = N(J.subs({"x": xx, "y": yy}))

最新更新