2013-04-18 18 views
0

我已衍生一些方程一些變量。我想解決一個未知的變量。我正在使用Sympy。我的代碼如下: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。我沒有任何警告消息,但我沒有任何解決方案。有人會提出一種替代方案或可能的解決方案嗎?提前致謝。

+1

這是一個糟糕的主意只是爲了甩掉你的代碼,並期待一個有意義的答案。你可以嘗試創建一個最簡單的例子,並解釋應該發生什麼以及你嘗試過什麼?另外,我看到你實際上在處理數字方程。在這種情況下,爲什麼你使用sympy(一個符號庫)而不是numpy/scipy更適合數字? – Krastanov

+0

表示歉意我放棄了我的代碼,這可能會造成的任何不便的方式。我想要做的是找到C0。我有6個函數,都是C0(C_t,St123,St45,l1,l2,l3)。最後一個函數顯示了這6個函數(C_b)之間的關係。如果我們用C_b等式中的C_t,St123等項代替,那麼我們將得到一個有C_b和C0未知數的大方程。在最後一行,我試圖做的是在C_b爲10.4時找到C0。你認爲用SciPy會容易得多嗎? Thnaks很多。 – GiorgosR

回答

1

正如我在評論都提到了這個問題在本質上是數字的,所以最好嘗試與numpy的/ SciPy的解決這個問題。儘管如此,這是一個有趣的例子,如何在sympy中進行數字化處理,因此這裏是一個建議的工作流程。

首先,如果它是不表達的相對複雜性在這裏,SciPy的將是絕對超過sympy是更好的選擇。但是這種表達比較複雜的,所以我們可以先簡化它在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 

現在給你不感興趣的符號處理和簡化是不是那麼好,它會毫無用處繼續使用sympy而不是scipy,但如果你堅持你可以做到這一點。

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

如果您嘗試使用solve,而不是nsolve你只是浪費了大量的資源,尋找一個象徵性的解決方案(可能不是在小學方面甚至存在)時,一個數字一個是瞬時的。

+0

非常感謝您的回答。我真的很感激。其實我預計值約0.05。當我將弧度更改爲度數時,我的解決方案更好,但帶有負號。我期待着採取兩種解決方案,一種是消極的,一種是積極的,所以我想保持積極的態度。你認爲SciPy更好嗎?我試圖找到某人可以解決一個未知的變量,但我找不到有用的東西。 SymPy似乎做得更好,但我不知道如何取得兩個根。 – GiorgosR

+1

數值求解器主要是做一些牛頓法(檢查維基百科)的花式版本,所以需要一個初始值來開始搜索(上面的「1」)。如果你玩初始值,你可能會發現另一個根。您還可以繪製這些函數以更好地瞭解它們的外觀。而關於'scipy'的問題:'nsolve'比求根或優化流程,在'scipy'更簡單,但SciPy的爲您提供了數字細節更多的控制。另一方面,Sympy支持您在scipy中無法實現的符號。然而這個問題很複雜。 – Krastanov