2013-02-15 50 views
0

讓我們說我有一個公式的Python和fsolve():一個函數f(x)由fsolve所謂的動態內容()

x + 2*cos(x) = 0 

,我想解決這個問題。然後我可以編程以下內容:

def func1(x): 
    out = x + 2*cos(x) 
    return out 
Solution = fsolve(func1, StartValue) 

在此示例中,StartValue可以具有任意值。到現在爲止還挺好!我正在編寫一個模擬程序,創建一個我想用fsolve()解決的非線性方程組。 現在的挑戰是,運行時間之前(!)非線性方程組的大小是未知的(!)。這意味着,我可以具有例如

X + 2個* COS(X)= 0

以同樣的方式,我可以有

2*x + 4*y = 0 
18*y -18 = 0 

爲了解決的最後提到的系統公式(這通常會永遠在我的節目一個非線性的)我已經找到了以下解決方案:

def func2(x): 
    out = [2*x[0] + 4*x[1]] 
    out.append(18*x[1]-18) 
    return out 
Solution = fsolve(func2, [1, 1]) 

這工作得很好了。但是爲什麼我不能使用func2(x)顯示的解決方案有一定的原因:它使我的程序非常慢! 函數fsolve()迭代地調用函數func2(x)數次,直到找到解[-2 1]爲止。但是我的程序會處理幾百到幾十行的線性方程組 。這意味着在每個迭代步驟中,所有這些連續行都被附加,如func2(x)所示。因此,我正在尋找一種方法作爲函數func3(x)創建方程組,並且之後fsolve()僅調用現成的func3(x)。下面是一個僞代碼示例:

func3 = lambda x: 2*x[0] + 4*x[1] 
func3.append(lambda x: 18*x[1] - 18) 
Solution = fsolve(func3, [1, 1]) 

不幸的是,功能不能如我在僞代碼顯示它上面追加。因此,我的問題:我如何動態地建立我的函數func3,然後通過( !)ONCE READY BUILT(!)函數func3到fsolve()?

非常感謝你提前

回答

0

解決方案:「外包的命令轉換成字符串concetanation」 一個可以構建功能之外的字符串,如下所示:

StringCommand = "f = [2*x[0] + 4*x[1], 18*x[1] - 18]" 

此後該StringCommand作爲要調用的函數的輸入參數如下:

def func(x,StringCommand): 
    exec StringCommand 
    return f 

因此,StringCommand通過命令執行EXEC。最後,只需要在fsolve()中調用該函數,如下所示:

fsolve(func, [1, 1], StringCommand) 

就是這樣。這樣做,StringCommand在函數func()之外構建一次,因此當fsolve()使用函數func()進行迭代時,會節省大量時間。請注意,[1,1]是迭代的起始值!