0

いくつかの変数を使用していくつかの方程式を導出しました。未知の変数を解きたい。私はSympyを使用しています。私のコードは次のとおりです。

import sympy as syp

import math as m
#this is the unknown variable that I want to find
C0 = syp.Symbol('C0')
#Known variables
D0 = 0.874

theta2 = 10.0
fi2 = 80.0

theta1 = (theta2/180.0)*m.pi
fi1 = (fi2/180.0)*m.pi
#Definitions of 6 different equations all of them in respect to CO.
C_t = 5*m.pi*(D0+4*C0)

St123 = 1.5*theta1*(D0+2*C0)

St45 = fi1*(D0+7*C0)

l1 = syp.sqrt((0.5*(D0+4*C0)-0.5*D0*m.cos(theta1))**2 + (0.5*D0*m.sin(theta1))**2)

l2 = syp.sqrt((0.5*(D0+6*C0)-0.5*(D0+2*C0)*m.cos(theta1))**2 + (0.5*(D0+2*C0)*m.sin(theta1))**2)

l3 = syp.sqrt((0.5*(D0+8*C0)-0.5*(D0+4*C0)*m.cos(theta1))**2 + (0.5*(D0+4*C0)*m.sin(theta1))**2)
#Definition of the general relationship between the above functions. Here C0 is unknown and C_b
C_b = C_t + 6*C0 + 3*(l1+l2+l3) - 3*St123 - 3*St45
#for C_b = 10.4866, find C0
syp.solve(C_b - 10.4866, C0)

観察されたように、C_b と C0 の関係を解決したいと考えています。最後の行まで、私のコードは正常に動作します。スクリプト全体を実行すると、C0 の計算に時間がかかるようです。警告メッセージはありませんが、解決策もありません。誰かが代替案または可能な解決策を提案しますか? よろしくお願いします。

4

1 に答える 1

1

コメントで述べたように、この問題は本質的に数値であるため、numpy/scipy で解決することをお勧めします。それにもかかわらず、sympy で数値を処理する方法の面白い例であるため、推奨されるワークフローの 1 つを次に示します。

まず第一に、ここでの式の相対的な複雑さがなければ、sympy よりも scipy の方が間違いなく優れたオプションでした。しかし、式はかなり複雑なので、最初に単純化してsympyから にフィードすることができscipyます:

>>> C_b
38.0∗C0
+3.0∗((0.17∗C0+0.076)∗∗2+(2.0∗C0+0.0066)∗∗2)∗∗0.5
+3.0∗((0.35∗C0+0.076)∗∗2+(2.0∗C0+0.0066)∗∗2)∗∗0.5
+3.0∗((2.0∗C0+0.0066)∗∗2+0.0058)∗∗0.5
+9.4

>>> simplify(C_b)
38.0∗C0
+3.0∗(4.0∗C0∗∗2+0.027∗C0+0.0058)∗∗0.5
+3.0∗(4.1∗C0∗∗2+0.053∗C0+0.0058)∗∗0.5
+3.0∗(4.2∗C0∗∗2+0.08∗C0+0.0058)∗∗0.5
+9.4

あなたがシンボリックに興味がなく、単純化がうまくいかなかったことを考えると、scipy の代わりに sympy を使い続けるのは無意味ですが、あなたがそれを行うことができると主張するなら.

>>> nsolve(C_b - 10.4866, C0, 1) # for numerical solution
0.00970963412692139

solve代わりに使用しようとするとnsolve、数値解が瞬間的である場合に、シンボリック解 (初等用語でさえ存在しない可能性があります) を検索する際に多くのリソースを浪費するだけです。

于 2013-04-19T13:06:42.323 に答える