SymPy 不使用 subs 评估指数函数
SymPy not evaluating exponential function with subs
我正在尝试在 Python
中编写多元 Newton-Raphson 方法的实现。首先,我正在尝试解决系统问题:
10 * x + 3 * y * y - 3
x * x - exp(y) - 2
尽管我打算将其扩展到任意 m x n
系统(当然,假设解决方案是 possible/exists)。
我的代码如下:
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()
我的问题是,当我对矩阵 F
和 J
执行 .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
虽然我需要一个严格的数值,以更新猜测 xx
和 yy
。
Sympy 专用于符号求值。 exp(3) 是一个无理数,因此不能用数字表示。 Sympy 知道这一点。
要强制进行数值近似,您可以使用 sympy 中的 N
函数,如
A = N(J.subs({"x": xx, "y": yy}))
我正在尝试在 Python
中编写多元 Newton-Raphson 方法的实现。首先,我正在尝试解决系统问题:
10 * x + 3 * y * y - 3
x * x - exp(y) - 2
尽管我打算将其扩展到任意 m x n
系统(当然,假设解决方案是 possible/exists)。
我的代码如下:
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()
我的问题是,当我对矩阵 F
和 J
执行 .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
虽然我需要一个严格的数值,以更新猜测 xx
和 yy
。
Sympy 专用于符号求值。 exp(3) 是一个无理数,因此不能用数字表示。 Sympy 知道这一点。
要强制进行数值近似,您可以使用 sympy 中的 N
函数,如
A = N(J.subs({"x": xx, "y": yy}))