2017-12-12 4 views
1

Allright。だから私は、3x3係数行列(cという名前)と従属変数array(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-いつ疑問に思うのですか) –

+0

さて、申し訳ありません。私はこのシステムを解決しています: c = np。 d = np.array([F、1、0、0]、 [0、p ['L']、0]、 [0、0、p ['L']] (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} 

注意。


実際SymPyで方程式を生成し、lambdifyでnumpyのにそれらを変換するには、我々はそれらを使用できるように、ここで私は、再び文字列を使用してpを定義しています

>>> 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.  ]]) 

のようなものを使用する場合があります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を添字として表示します。

関連する問題