我有一个中等大的非线性方程系统,我想在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可以接受的方式返回向量?
发布于 2017-04-14 09:12:44
后两种方法从不创建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是另一个很好的选择。
https://stackoverflow.com/questions/43403791
复制相似问题