2016-11-06 2 views
1

VIDEO은 3 개의 방정식과 3 개의 변수가있는 경우 단순화 된 케이스에서이를 수행하는 방법에 대한 정말 멋진 데모입니다.파이썬 방정식 시스템을 준비하는 방법

의 나는 다음과 같은 시스템 변수 F1, X1과 X2에 대한

enter image description here

를 해결하기 위해 완 가정 해 봅시다. 이것은 매우 작은 시스템이므로 수동으로 쉽게 할 수 있습니다. 그러나 이것은 단순화 된 예입니다 - 실제로 시스템은 100 개의 변수와 100 개의 방정식으로 구성됩니다.

제 질문은이 시스템을 해결하기 위해 변수를 분리하는 방법입니다. 하나의 벡터에서 모든 변수를 모으고 시스템을 다시 작성하여 해결할 수있는 방법은 무엇입니까? 결국 내가 원하는 것은 f1, x1 및 x2에 대한 숫자 값입니다.

ps : 방금 난수를 삽입하여이 시스템을 만들었습니다. 나는 시스템을 해결할 수있을 지 모르겠지만 ... 당신은 아이디어를 얻는다. (이 경우 숫자 값을 조정하십시오).

+0

RyA, rho1, A, L 등으로 W_2, Phi_2, W_3 등을 표현해야합니다. –

+0

@ IlyaV.Schurov 나는 나 자신이 나쁘지 않다는 것을 알 수있다. 변수는'변수 = [RyA, RMA, W_2, Phi_2, W_3, Phi_3, RyB, Phi_4, W_5, Phi_5] '이므로 일부는 RHS에있는 반면 다른 변수는 RHS에 있습니다. 저는 어떻게해서 num.linalg.solve()를 사용하기 위해 5:30에 첨부 된 비디오 에서처럼 변수를 한쪽에서 다른쪽으로 옮겨야합니다. – skrat

+0

수학적 용어로 시스템을 작성할 수 있습니까 (아마도 단순화 된 형태로)? –

답변

1

내가 이해하는 한, RyA 및 현재 오른쪽에있는 기타 변수를 처리하도록 시스템의 행렬을 조정해야합니다. 수동으로 할 수 있습니다.이 경우이 질문은이 사이트의 범위를 벗어나지 만 순전히 수학적인 시험입니다.

from sympy import Matrix, symbols, solve 

x1, x2, f1 = symbols('x1 x2 f1') 
X = Matrix([0, x1, x2]) 
B = Matrix([f1, 50, 60]) 
M = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 

solve(M * X - B, [x1, x2, f1]) 

# {f1: 40, x2: 100/3, x1: -30} 

sympynumpy.linalg보다 숫자 선형 시스템을 해결 속도가 느려질 수 있습니다, 그래서 당신의 대수 부분을 할 sympy을 사용할 수 있습니다 : 당신을 위해 문제의 대수 부분을 할 수있는 대신 np.linalg.solve()sympy 작업, 행렬과 오른편을 계산 한 다음 numpy.linalg.solve을 사용하여 해결하십시오.

import numpy as np 
from sympy import expand 
def symbolic_to_matrix(F, variables): 

    """ 
    F is a symbolic vector function that is a left hand side of equation F = 0 
    variables is a list of variables (sympy.Symbol's) which F depends on. 

    Assuming that there exists numeric matrix A such that equation F = 0 
    is equivalent to linear equation Ax = b, this function returns 
    tuple (A, b) 
    """ 
    A = [] 
    b = [] 
    for row in F: 
     coeffs = expand(row).as_coefficients_dict() 
     A.append([float(coeffs[x]) for x in variables]) 
     b.append(-float(coeffs[1])) 
    return np.array(A), np.array(b) 

A, b = symbolic_to_matrix(M * X - B, [x1, x2, f1]) 
# A 
# array([[ 2., 3., -1.], 
#  [ 5., 6., 0.], 
#  [ 8., 9., 0.]]) 
# b 
# array([ -0., 50., 60.]) 

np.linalg.solve(A, b) 
# array([-30.  , 33.33333333, 40.  ]) 
# the same answer 
+0

나는 OP를 편집하여 질문이 더 분명 해졌습니다. 나는 당신의 대답이 정확하다고 생각합니다, 만약 당신이 제 예제에 그것을 조정할 수 있다면 ... 완벽 할 것입니다! ps : LaTeX을 가지고 있지 않다는 이유로 stackoverflow에 큰 투표. – skrat

+1

수정 된 질문에 따라 답변을 수정했습니다. –

+0

sympy가 numpy와 어떻게 상호 작용하여 성능을 향상시킬 수 있는지 예제를 추가했습니다. –

관련 문제