在朱莉娅使用PyCall的Scipy

Tak*_*ris 3 python scipy 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)
Run Code Online (Sandbox Code Playgroud)

但是,这不是:

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)
Run Code Online (Sandbox Code Playgroud)

这也不是:

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)
Run Code Online (Sandbox Code Playgroud)

由于问题的性质,我认为不使用循环是不可行的.有没有办法以fsolve可以接受它的方式返回向量?

Chr*_*kas 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
Run Code Online (Sandbox Code Playgroud)

它将自动匹配大小和类型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
Run Code Online (Sandbox Code Playgroud)

但是你想要这样做,你需要制作数组.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
Run Code Online (Sandbox Code Playgroud)

应该分配更少,做得更好.Roots.jl是另一个很好的Julia选项.