你好,我有这个代码:
import numpy as np
from sympy import *
import sympy
x = Symbol('x')
x0 = Symbol('x0')
B = Symbol('B')
E = Symbol('E')
linewidth = Symbol('linewidth')
f = 1/pi*(linewidth/2)/((x - (E+2*B))**2 + (linewidth/2)**2)
def makeOneMeasurement(pCov,f,sigma,pvec,pmean):
Iprior = np.linalg.inv(pCov)
derivative_f = [f.diff(E),f.diff(B)]
F = []
for i in range(len(derivative_f)):
for j in range(len(derivative_f)):
g = derivative_f[i]*derivative_f[j]
for k in range(len(pvec)):
g = g.subs(pvec[k], pmean[k])
F = F + [g]
F = np.reshape(F,(2,2))/sigma**2
F = sympy.Matrix(F)
Iprior = sympy.Matrix(Iprior)
return (Iprior + F).det()
如果我这样调用这个函数:
makeOneMeasurement([[1,0],[0,1]],f,0.1,["linewidth","E","B"],[0.1,990,0.11]).subs(x,990).evalf()
我得到输出1(正好是1)。但是,如果不返回return (Iprior + F).det()
,我只返回return (Iprior + F)
,我调用:
makeOneMeasurement([[1,0],[0,1]],f,0.1,["linewidth","E","B"],[0.1,990,0.11]).subs(x,990).evalf().det()
(基本上完全相同,但det在函数外部而不是内部调用),我得到:
3653.9564196053
我做错了什么?我希望能够将行列式作为x的函数返回(因此我希望使用第一个版本)。为什么我总是得到1而不是x的函数?谢谢大家!
更改代码以避免所有浮点数的使用,包括避免所有numpy例程的使用,如
inv
和reshape
(使用sympy等价项):那么精确的矩阵和行列式是:
正如你所看到的,里面有大量的数字。您可以使用精确替换获得行列式的公式,然后对其求值:
期望能够在不显著降低精度的情况下将低精度浮点替换为这样的表达式是不合理的,因此在最后调用
evalf
之前使用精确计算相关问题 更多 >
编程相关推荐