2017-12-12 7 views
1

Allright. 그래서 저는 3x3 계수 행렬 (c)와 종속 귀중품 배열 (d)를 사용하여 3 선형 방정식에 대한 해를 구하려고 노력합니다. MY CODE :''지정된 서명과 일치하는 루프가 없습니다. ''선형 방정식을 풀려고 할 때 오류가 발생했습니다.

import numpy as np 

import sympy as sym 

Ax, Ay, By, M0, F, q, L, L1, L2 = sym.symbols('A_x, A_y, B_y, M_0, F, q, L, L_1, L_2') 

p = {'L': 6, 'L_1': 4, 'L_2': 2, 'q': 2000, 'F': 1000, 'M_0': 4000} 

eq_Fx = sym.Eq(Ax - F, 0) 

eq_MB = sym.Eq(-Ay*L + q*L1*(L1/2) + M0, 0) 

eq_MA = sym.Eq(By*L + M0 - L1*q*(L1/2), 0) 

c = np.array([[1, 0, 0], 

[0, p['L'], 0], 

[0, 0, p['L']]]) 

d = np.array([F, 

(p['q']*p['L_1']**2)/2 + p['M_0'], 

(p['q']*p['L_1']**2)/2 - p['M_0']]) 

result = np.linalg.solve(c, d) 

print(result) 

그것은 내가 이해하지 못하는 이상한 오류가 발생합니다 :

TypeError: No loop matching the specified signature and casting was found for ufunc solve1.

사람도 무슨 뜻인지 알거나 그것을 해결하는 방법을 만약 내가 감사 넘어 될 것입니다.

+0

코드 이미지를 SO로 게시하지 마십시오 ([이 링크] (https://meta.stackoverflow.com/questions/285551/why-not-upload-images-of-code-on-so-html) 질문 할 때) 이유를 궁금하다면 –

+0

오케이, 미안. 이 시스템을 해결하고 있습니다 : c = np.배열 [[[1, 0, 0], [0, p [ 'L'], 0], [0, 0, p [ 'L']]] d = np.array ([F, (p [ 'q'] * p [ 'L_1'] ** 2)/2 + p [ 'M_0'], - p [ 'M_0']]) 여기서 c는 계수 행렬이고 d는 내 의존 귀중품 배열입니다. 이들은 다음 데이터를 사용하고 있습니다 : p = { 'L': 6, 'L_1': 4, 'L_2': 2, 'q': 2000, 'F': 1000, 'M_0': 4000} 그래서 나는이 방법으로 시스템을 해결 시도 : 결과 = np.linalg.solve (C, D) 인쇄 (결과) 그러나 그것은 작동하지 않습니다. :/ –

+0

질문을 편집하고 코드를 게시하십시오 –

답변

1

방정식을 기호식으로 풀거나 조작하려면 SymPy를 사용해야합니다. 수치 해를 원하면 NumPy를 사용해야합니다. SymPy 표현식으로 시작하여 NumPy 함수로 이동하려면 lambdify을 사용해야합니다.

코드에서 SymPy 방정식을 만들었지 만 사용하지는 않았습니다. 문제는 d의 정의에서 p['F'] 대신 F을 사용하여 평가되지 않은 SymPy 기호 F이있는 NumPy 배열을 만드는 것이고 처리 방법을 모르는 것입니다. 실제로 SymPy 부분을 완전히 제거하면 방정식이나 기타를 파생시키기 위해 코드를 전혀 사용하지 않아 코드가 계속 작동합니다.

그런데 방정식이 선형이므로 SymPy가 정확하게 풀 수 있습니다. 관심이 있다면 그렇게하는 방법이 있습니다. 내가 subs 그들을 대체 할 수 있도록, 기호 자체가 아닌 문자열을 사용 p을 정의

>>> p = {M0: 4000, L1: 4, F: 1000, L: 6, L2: 2, q: 2000} 
>>> solve([eq_Fx.subs(p), eq_MB.subs(p), eq_MA.subs(p)], [Ax, Ay, By]) 
{B_y: 2000, A_x: 1000, A_y: 10000/3} 

참고.


실제로 우리가 사용할 수 있도록 당신이 여기

>>> linear_eq_to_matrix([eq_Fx, eq_MB, eq_MA], [Ax, Ay, By]) 
(Matrix([ 
[1, 0, 0], 
[0, -L, 0], 
[0, 0, L]]), Matrix([ 
[    F], 
[-L_1**2*q/2 - M_0], 
[ L_1**2*q/2 - M_0]])) 
>>> C, D = linear_eq_to_matrix([eq_Fx, eq_MB, eq_MA], [Ax, Ay, By]) 
>>> p = {'L': 6, 'L_1': 4, 'L_2': 2, 'q': 2000, 'F': 1000, 'M_0': 4000} 
>>> fC = lambdify([M0, F, q, L, L1, L2], C, 'numpy', dummify=False) 
>>> fC(**p) 
array([[ 1, 0, 0], 
     [ 0, -6, 0], 
     [ 0, 0, 6]]) 
>>> c = fC(**p) 
>>> fD = lambdify([M0, F, q, L, L1, L2], D, 'numpy', dummify=False) 
>>> d = fD(**p) 
>>> import numpy 
>>> np.linalg.solve(c, d) 
array([[ 1000.  ], 
     [ 3333.33333333], 
     [ 2000.  ]]) 

내가 다시 문자열을 사용 p을 정의하는 것 같은 뭔가를 사용할 수 있습니다, SymPy와 방정식을 생성하고 lambdify와 NumPy와로 변환하려면 lambdified 함수의 키워드 인수로 사용하십시오 (그렇지 않으면 fC(4000, 1000, 2000, 6, 4, 2)과 같은 순서로 전달해야합니다). 이 작업을 수행하려면 dummify=False 인수가 필요합니다.

linear_eq_to_matrix 함수는 기호 방정식을 SymPy 행렬로 변환합니다. lambdify 그러면 기호 요소가있는 SymPy 행렬을 숫자 NumPy 배열로 변환 할 수 있습니다.

마지막 주 : 당신은 당신이 사용 또는 예를 들어, 사용자의 기호에 밑줄 및 변수 이름의 비 사용에 일관성이 있다면 자신을 위해 많은 혼란을 방지하려면 사용합니다

M0 = symbols("M0") 

또는

M_0 = symbols("M_0") 

SymPy는 어느 경우에도 0을 아래 첨자로 인쇄합니다.