2017-04-14 40 views
3

我有一箇中等大的非線性方程組,我想用Julia中的scipy.optimize來解決。問題是我將這些方程存儲在一個向量中,然後我將它們傳遞給解算器,PyCall不接受它。例如,這些方法都工作:在Julia中使用PyCall的Scipy

using PyCall 
@pyimport scipy.optimize as so 

function F(x) 
f1=1- x[1] - x[2] 
f2=8 - x[1] - 3*x[2] 
return f1, f2 
end 

x0 = [1,1] 
x = so.fsolve(F, x0) 

function G(x) 
f=[1 - x[1] - x[2], 
    8 - x[1] - 3*x[2]] 
return f 
end 

x0 = [1,1] 
x = so.fsolve(G, x0) 

儘管如此,這並不:

function H(x) 
f[1]=1 - x[1] - x[2] 
f[2]=8 - x[1] - 3*x[2] 
return f 
end 

x0 = [1,1] 
x = so.fsolve(H, x0) 

無論是做這個的:

function P(x) 
f[1]= 1 - x[1] - x[2] 
f[2]= 8 - x[1] - 3*x[2] 
return f[1], f[2] 
end 

x0 = [1,1] 
x = so.fsolve(P, x0) 

我不認爲不使用一個循環,因爲它是可行的問題的性質。有沒有什麼方法可以以可以接受的方式返回矢量?

回答

6

第二種方法從來沒有創建f這是問題。你必須先創建數組。

function H(x) 
f = similar(x) 
f[1]=1 - x[1] - x[2] 
f[2]=8 - x[1] - 3*x[2] 
return f 
end 

,它會自動匹配的x的尺寸和類型,或者您可以使用構造:但是你想這樣做

function H(x) 
f = Vector{Float64}(2) 
f[1]=1 - x[1] - x[2] 
f[2]=8 - x[1] - 3*x[2] 
return f 
end 

,你需要做的陣列。 P也有同樣的問題。

另外,您應該結帳NLSolve.jl。它允許預先分配的形式:

function H(x,f) 
f[1]=1 - x[1] - x[2] 
f[2]=8 - x[1] - 3*x[2] 
return nothing 
end 

應分配較少的和做的更好。 Roots.jl是另一個很好的Julia選項。

+0

非常感謝!我曾嘗試NLSolve,我不確定爲什麼必須將f向量包含在H(x,f)中。現在變得清楚了。 我與NLSolve的問題是,即使我初步猜測我從Matlab獲得的解決方案,它也沒有收斂。 –

+0

我會打開關於這個問題的另一個問題。我會懷疑你的代碼中有錯誤。 –