我有一个中等大小的非线性方程组,我想用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可以接受它的方式返回向量?
答案 0 :(得分: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选项。