Sympy 패키지를 사용하여 a라는 기호 변수가있는 방정식이 있습니다. 이 변수를 사용하여 6 * 6 행렬을 만들었습니다.
array([[1, exp(-0.04*a**2), exp(-0.16*a**2), exp(-0.36*a**2),
exp(-0.64*a**2), exp(-1.0*a**2)],
[exp(-0.04*a**2), 1, exp(-0.04*a**2), exp(-0.16*a**2),
exp(-0.36*a**2), exp(-0.64*a**2)],
[exp(-0.16*a**2), exp(-0.04*a**2), 1, exp(-0.04*a**2),
exp(-0.16*a**2), exp(-0.36*a**2)],
[exp(-0.36*a**2), exp(-0.16*a**2), exp(-0.04*a**2), 1,
exp(-0.04*a**2), exp(-0.16*a**2)],
[exp(-0.64*a**2), exp(-0.36*a**2), exp(-0.16*a**2),
exp(-0.04*a**2), 1, exp(-0.04*a**2)],
[exp(-1.0*a**2), exp(-0.64*a**2), exp(-0.36*a**2),
exp(-0.16*a**2), exp(-0.04*a**2), 1]], dtype=object)
위의 변수는 sympy 기호입니다. 이제이 행렬을 역전시키고 싶습니다. numpy를 사용하면 다음과 같은 오류가 발생합니다.
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-117-3c958037db81> in <module>()
----> 1 inv(np.array(final_result))
D:\datascience\lib\site-packages\numpy\linalg\linalg.py in inv(a)
526 signature = 'D->D' if isComplexType(t) else 'd->d'
527 extobj = get_linalg_error_extobj(_raise_linalgerror_singular)
--> 528 ainv = _umath_linalg.inv(a, signature=signature, extobj=extobj)
529 return wrap(ainv.astype(result_t, copy=False))
530
TypeError: No loop matching the specified signature and casting
was found for ufunc inv
그리고 Sympy 자체 구문을 사용하여 M ** -1 인이 행렬을 역전 시키면 시간이 너무 오래 걸리고 결과를 계산하지 않습니다. numpy를 사용하여이 행렬을 반전하는 방법이 있습니까? 또는 순수한 파이썬 구문?
심볼릭 역을 찾고 있다면 SymPy를 사용해야합니다. NumPy는 숫자의 역수 만 계산하며,이 알고리즘이 사용하는 알고리즘은 기호 행렬에서 작동하지 않습니다.
이 행렬에서는 SymPy에서 사용하는 기본 알고리즘이 느린 것처럼 보이지만 method
키워드를의 inv
메소드 에 전달하여 대체 알고리즘을 시도 할 수 있습니다 Matrix
. 사용 가능한 옵션은 'GE'
(기본값) 'LU'
, 및 'ADJ'
입니다.
또한 M.subs(exp(-a**2/25), b)
계산에 도움이 될 수 있습니다 . 이렇게하면 결과 행렬은 단지 거듭 제곱입니다 b
(이 작업을 수행하려면 부동 소수점 대신 유리수를 사용해야합니다). 나는 역으로 얻을 수 있었다
a, b = symbols('a b')
M = Matrix([[1, exp(-a**2/25), exp(-4*a**2/25), exp(-9*a**2/25), exp(-16*a**2/25), exp(-a**2)], [exp(-a**2/25), 1, exp(-a**2/25), exp(-4*a**2/25), exp(-9*a**2/25), exp(-16*a**2/25)], [exp(-4*a**2/25), exp(-a**2/25), 1, exp(-a**2/25), exp(-4*a**2/25), exp(-9*a**2/25)], [exp(-9*a**2/25), exp(-4*a**2/25), exp(-a**2/25), 1, exp(-a**2/25), exp(-4*a**2/25)], [exp(-16*a**2/25), exp(-9*a**2/25), exp(-4*a**2/25), exp(-a**2/25), 1, exp(-a**2/25)], [exp(-a**2), exp(-16*a**2/25), exp(-9*a**2/25), exp(-4*a**2/25), exp(-a**2/25), 1]])
M2 = M.subs(exp(-a**2/25), b)
M2inv = simplify(M2.inv('ADJ')) # takes a little time to compute, about 1:30 on my machine
Minv = M2inv.subs(b, exp(-a**2/25))
하루가 끝나면 행렬의 기호 역이 필요한지 고려할 수 있습니다. 숫자 값을 대체 한 a
다음 NumPy로 숫자 역수를 계산하는 것으로 충분 합니까? 실제로 역이 필요합니까? 일반적으로 행렬의 명시 적 역을 계산하는 것은 숫자 계산에 적합하지 않습니다. 일반적으로 같은 것을 사용하는 것이 좋습니다 numpy.linalg.solve
.
심볼릭 역은 일반적으로 매우 복잡한 표현이며 본질적으로 계산하기 어렵습니다. 숫자 역은 수치 적으로 매우 불안정하며 해결하려는 문제를 해결하기 위해 계산하는 데 거의 좋은 생각이 아닙니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다