matlab:在fsolve中使用未知向量

matlab:在fsolve中使用未知向量,matlab,function,Matlab,Function,我需要解一个非线性方程组;为了使用fsolve,我编写了一个包含函数myfun的m文件。此函数由主m文件调用 系统和未知数都必须使用for循环写入 例如: function F=myfun(x) n=20;` for j=1:n c1=sqrt(x(j)^2-3*x(j)); c2=x(j)^(1/2); F(j)=c1+c2; end 我的问题是,我必须为向量F和x预先分配内存,否则解算器会认为numelx=1。 但如果我宣布 F=zeros(n,1); x=zeros(n,

我需要解一个非线性方程组;为了使用fsolve,我编写了一个包含函数myfun的m文件。此函数由主m文件调用

系统和未知数都必须使用for循环写入

例如:

function F=myfun(x)
n=20;`
for j=1:n
    c1=sqrt(x(j)^2-3*x(j));
    c2=x(j)^(1/2);
F(j)=c1+c2;
end
我的问题是,我必须为向量F和x预先分配内存,否则解算器会认为numelx=1。 但如果我宣布

F=zeros(n,1);
x=zeros(n,1);
我有以下输出:

No solution found.
fsolve stopped because the problem appears regular as measured by the gradient,
but the vector of function values is not near zero as measured by the
default value of the function tolerance.

有什么建议吗?谢谢

您不需要循环,只需使用

F = sqrt(x.^2-3*x) + x.^(1/2);
那么你也不需要声明n,c1,c2


您的错误消息听起来也不是分配问题,但更重要的是找到解决问题的方法。

在fsolve中使用它需要它是一个函数,所以我更喜欢匿名函数fun=@x sqrtx。^2-3*x+sqrtx。是的,F应该仍然在函数中,就像OP中一样。匿名函数是一个不错的选择。事实上,我发布的示例不太合适;我把问题简单化了。我的代码听起来或多或少是这样的:F=myfunx for i=1:20 j=4+i if i>2&&上述方法将函数转换为标量函数:单个x映射到单个y上,向量x映射到相同长度的向量y上。我们之所以执行这一步,是因为只有当一个函数的输入x可以是标量,可以是向量,也可以是标量时,才可能解一个方程,或者等价地,解一个函数!输出y。您的函数没有这样做,因此这是您应该修复的。从上面看,仍然不清楚标量函数应该是什么样子。因为我需要解一个非线性系统,所以我发现fsolve是唯一能让我这样做的命令。所以我的输出将是一个包含未知值的向量。我真正的问题是,因为我必须写出系统的方程,每个方程中至少有3个未知数,它们的指数与方程中的指数不一致。我怎样才能修好它?请不要考虑我的第一个例子,它不能反映我的问题的复杂性。