簡體   English   中英

在朱莉婭使用PyCall的Scipy

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM