【发布时间】:2021-10-18 01:05:30
【问题描述】:
我正在尝试计算雅可比矩阵的逆矩阵。我使用 sympy 计算了雅可比行列式。但是,现在当我尝试 inv 矩阵时,我得到了一个我不明白的错误。如果有人可以帮助我,那就太好了
import numpy as py
from numpy.linalg import inv
from sympy import Matrix
import warnings
def f1(y1, y2, y3, y1_old, dt):
return y1_old + (-0.04*y1 + 10**4*y2*y3)*dt
def f2(y1, y2, y3, y2_old, dt):
return y2_old + (0.04*y1 - 10**4*y2*y3 - (3.10**7)*(y2**2))*dt
def f3(y1, y2, y3, y3_old, dt):
return y3_old + ((3.10**7)*(y2**2))*dt
def j(y1,y2,y3):
a = Matrix(('-0.04*y1 + 10**4*y2*y3','0.04*y1 - 10**4*y2*y3 - (3.10**7)*
(y2**2)','(3.10^7)*(y2**2)')).jacobian(('y1', 'y2', 'y3'))
a = str(a)
a = eval(a)
return a
warnings.filterwarnings("ignore", category=DeprecationWarning)
y_old = py.zeros((3,1))
y_old[0] = 1
#Guess values for the implicit variable
y_guess = 2*py.ones((3,1))
#New values - assumed initially
y_new = py.ones((3,1))
F = py.copy(y_new)
start_time = 0
end_time = 10
dt = 0.01
nt = py.arange(start_time,end_time,dt)
error = 9e9
tol = 1e-10
alpha = 0.8
#for i in range(0,len(nt)):
#while error>tol:
jac = j(y_guess[0],y_guess[1],y_guess[2])
F[0] = f1(y_guess[0],y_guess[1],y_guess[2], y_old[0], dt)
F[1] = f2(y_guess[0],y_guess[1],y_guess[2], y_old[1], dt)
F[2] = f3(y_guess[0],y_guess[1],y_guess[2], y_old[2], dt)
j = inv(jac)#error
这是我得到的错误:
【问题讨论】:
-
that 有帮助吗?
-
不要使用 eval 原因在这些情况下可能效率低下。
sympy也可以计算非符号数学,因此j函数也可以是:def j(y1, y2, y3): return Matrix((-0.04*y1 + 10**4*y2*y3, 0.04*y1 - 10**4*y2*y3 - (3.10**7)* (y2**2), (3.10^7)*(y2**2))).jacobian((y1, y2, y3))(从计算中删除字符串) -
这行得通,但它不会计算导数 wrt 数。也就是说,我不能用值代替变量 y1、y2 和 y3。
-
对于我们这些无法运行您的代码的人来说,显示
jac将是礼貌的做法。我猜它是 object dtype,可能包含 sympy 符号。或ragged(因为你关闭了警告)