在Julia中求解非线性方程组

在Julia中求解非线性方程组,julia,Julia,我可以这样在Matlab中编写函数: function res=resid(theta,alpha,beta); RHS=[]; LHS=[]; RHS= theta-alpha; LHS= theta*beta; res = (LHS-RHS); 我们设置参数,调用函数: alpha=0.3;beta=0.95; a01=[1.0;1.0]; th=fsolve('resid',a01,[],alpha,beta) 这将返回[6.0;6.0]。选项“[]”是否向F发出信号,表示输入是矢量

我可以这样在Matlab中编写函数:

function res=resid(theta,alpha,beta); 
RHS=[];
LHS=[];
RHS= theta-alpha;
LHS= theta*beta;
res = (LHS-RHS);
我们设置参数,调用函数:

alpha=0.3;beta=0.95;
a01=[1.0;1.0];
th=fsolve('resid',a01,[],alpha,beta)
这将返回[6.0;6.0]。选项“[]”是否向F发出信号,表示输入是矢量

无论如何,我如何使用NLsolve、Optim或JuMP在Julia中实现这一点?最初的问题有10多个变量,所以我更喜欢向量方法

我可以在Julia中实现该功能:

h! =function (theta) 
RHS=[];
LHS=[];
RHS= theta-alpha;
LHS= theta*beta;
res= (LHS-RHS); 
return res;
end
但只需使用NLsolve:

a01 = [1.0;1.0];
res = nlsolve(h!,a01)
返回:

MethodError: no method matching (::##17#18)(::Array{Float64,1}, ::Array{Float64,1})
Closest candidates are:
  #17(::Any) at In[23]:3
如果我选择使用Optim,我会得到:

using Optim
optimize(h!, a01)
返回:

MethodError: Cannot `convert` an object of type Array{Float64,1} to an object of type Float64
This may have arisen from a call to the constructor Float64(...),
since type constructors fall back to convert methods.

谢谢你的建议

根据Chris Rackauckas的建议,解决方案是保留h的定义:

h =function (theta) 
RHS=[];
LHS=[];
RHS= theta-alpha;
LHS= theta*beta;
res= (LHS-RHS); 
return res;
end
以及在非现场使用:

a01 = [1.0;1.0];
solve = nlsolve(not_in_place(h),a01)
返回解决方案:

Results of Nonlinear Solver Algorithm
 * Algorithm: Trust-region with dogleg and autoscaling
 * Starting Point: [1.0,1.0]
 * Zero: [6.0,6.0]
 * Inf-norm of residuals: 0.000000
 * Iterations: 3
 * Convergence: true
   * |x - x'| < 0.0e+00: false
   * |f(x)| < 1.0e-08: true
 * Function Calls (f): 4
 * Jacobian Calls (df/dx): 4
非线性求解器算法的结果 *算法:带狗腿和自动缩放的信赖域 *起点:[1.0,1.0] *零:[6.0,6.0] *残差的Inf范数:0.000000 *迭代次数:3次 *收敛性:正确 *| x-x'|<0.0e+00:错误 *| f(x)|<1.0e-08:正确 *函数调用(f):4 *雅可比调用(df/dx):4
谢谢大家!

请说明您查看了NLsolve文档等的哪些部分,以及导致您出现问题的具体原因?有更新!您看过NLsolve.jl文档了吗?这不是定义函数的方式。如果您的函数不在适当的位置,您可以使用
nlsolve(不在适当的位置(f),首字母为x)
。但是为什么不直接使用文档中的就地版本呢<代码>函数f!(x,fvec)第一个向量是输入,第二个是输出?谢谢!不是在你的位置(f)会这样做。我只需要保留函数的奇怪定义!按照惯例,您不应该调用函数
h如果不是变异函数。看见此外,您应该将其标记为解决方案,以便其他用户可以看到它已解决。好的!但由于我自己写了一个答案,我将能够在48小时内做出标记。但是我会做的。。。