2017-04-14 20 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) 

私はそれがためにループを使用しないように実現可能だとは思いません問題の性質のfsolveがそれを受け入れることができるようにベクトルを返す方法はありますか?

答えて

6

第2の2つの方法は、問題であるfを決して作成しません。最初に配列を作成する必要があります。

自動的 xの大きさや種類にマッチします、またはあなたは、コンストラクタを使用することができます
function H(x) 
f = similar(x) 
f[1]=1 - x[1] - x[2] 
f[2]=8 - x[1] - 3*x[2] 
return f 
end 

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を試しましたが、私はなぜHベクトル(x、f)にfベクトルを含まなければならないのか分かりませんでした。今それは明らかになった。 私がNLSolveで持っていた問題は、Matlabから得た解決策を最初の推測として与えても収束しなかったということでした。 –

+0

私はそれについて別の質問を開くだろう。あなたのコードに誤りがあったと思われます。 –

関連する問題