[英]Scipy using PyCall in Julia
我有一個中等大小的非線性方程組,我想用Julia中的scipy.optimize來解決這個問題。 問題是我將方程存儲在向量中,然后將它傳遞給求解器,PyCall不接受它。 例如,這些方法都有效:
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可以接受它的方式返回向量?
后兩種方法永遠不會創建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選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.