2012-05-18 41 views
0

我試圖求解方程f(x) = x-sin(x) -n*t -m0解決與SciPy的的fsolve

在這個公式中,nm0方程是屬性,在我的類中定義。此外,t是等式中的一個常數整數,但它必須每次都改變。

我已經解決了方程,所以我得到一個'新方程'。我已經導入scipy.optimize

def f(x, self): 
    return (x - math.sin(x) -self.M0 - self.n*t) 

def test(self,t): 
    return fsolve(self.f, 1, args=(t)) 

任何更正和建議,使其工作?

+3

你能給我們一個完整的例子,包括這個「不起作用」嗎? – robert

+1

我不認爲我以前見過'f(x,self)',第一個參數會得到這個實例,不管你怎麼稱呼它。 – DSM

+0

它是從scipy.optimize的fsolve優化 – Saybia

回答

4

我可以看到至少有兩個問題:您已將參數順序混合到f,並且您沒有給f訪問t。像這樣的東西應該工作:

import math 
from scipy.optimize import fsolve 

class Fred(object): 
    M0 = 5.0 
    n = 5 

    def f(self, x, t): 
     return (x - math.sin(x) -self.M0 - self.n*t) 

    def test(self, t): 
     return fsolve(self.f, 1, args=(t)) 

[注意,我是懶惰和取得M0n類成員]這給

>>> fred = Fred() 
>>> fred.test(10) 
array([ 54.25204733]) 
>>> import numpy 
>>> [fred.f(x, 10) for x in numpy.linspace(54, 55, 10)] 
[-0.44121095114838482, -0.24158955381855662, -0.049951288133726734, 
0.13271070588400136, 0.30551399241764443, 0.46769772292130796, 
0.61863201965219616, 0.75782574394219182, 0.88493255340251409, 
0.99975517335862207] 
+0

它工作!謝謝你,我真的很感激! – Saybia

0

您正在使用某種根查找算法。有幾種常用的方法,所以知道哪一種會很有幫助。

你需要知道的三件事:

  1. 算法您使用
  2. 方程式你發現的根爲
  3. 初始猜測和範圍超過您正在尋找

您需要知道某些組合可能沒有任何根。

可視化感興趣的功能可能會有幫助。你有兩個:線性函數和正弦曲線。如果你打算這兩個,哪組常量會給你交集?交點就是你要找的根。

+0

主要的問題是它必須在一個類中完成。這就是爲什麼我需要在f(x,self)中定義方程。 – Saybia

1

您需要定義f()像這樣:

def f(self, x, t): 
    return (x - math.sin(x) - self.M0 - self.n * t) 

換句話說:

  1. self第一個(它總是);
  2. 然後是當前值x;
  3. 然後來到您提供給fsolve()的參數。