首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Julia中使用PyCall的Scipy

在Julia中使用PyCall的Scipy
EN

Stack Overflow用户
提问于 2017-04-14 08:52:25
回答 1查看 1K关注 0票数 4

我有一个中等大的非线性方程系统,我想在Julia中使用scipy.optimize来解决。问题是,我在将方程传递给求解器之前将它们存储在向量中,而PyCall不接受这一点。例如,这两种方法都有效:

代码语言:javascript
复制
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)

但是,这不会:

代码语言:javascript
复制
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)

这也不是:

代码语言:javascript
复制
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可以接受的方式返回向量?

EN

回答 1

Stack Overflow用户

发布于 2017-04-14 09:12:44

后两种方法从不创建f,这就是问题所在。您必须首先创建数组。

代码语言:javascript
复制
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的大小和类型,或者您可以使用构造函数:

代码语言:javascript
复制
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。它允许一个预先分配的表单:

代码语言:javascript
复制
function H(x,f)
 f[1]=1 - x[1] - x[2]
 f[2]=8 - x[1] - 3*x[2]
 return nothing
end

它应该分配更少的资源,做得更好。Roots.jl是另一个很好的选择。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43403791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档