未定义的功能' myfun'对于类型' double'的输入参数

时间:2018-02-20 23:15:51

标签: matlab

这个错误让我抓狂!我花了3个小时搜索原因可能是什么以及如何解决但无济于事。我只想用fsolve来解决非线性方程组。这就是我所做的:

创建名为myfun.m的函数文件:

function F = myfun(x)
F = [x(1)*x(2)+exp(x(1))+x(1)-3;
     x*sin(x)+(x(2))^2-2];
end

调用我的函数来计算根:

x0 = [0,0];
fsolve(@myfun,x0)

是的,我保存了一个名为" myfun"的函数文件。与我的其他Matlab文件完全相同的路径。

对于这种方法,我跟着这个人:https://www.youtube.com/watch?v=WPVuyJ3uHhE

它对他来说很完美,但不适合我。有谁导致我的错误?以下是整个错误消息:

Undefined function 'myfun' for input arguments of type 'double'.

Error in fsolve (line 230)
            fuser = feval(funfcn{3},x,varargin{:});

Error in Bonus_a (line 14)
fsolve(@myfun,x0)

Caused by:
    Failure in initial objective function evaluation. FSOLVE cannot continue.

2 个答案:

答案 0 :(得分:3)

首先,您的第二个等式是不正确的,因为您将x混合为向量而将x混合为标量。更正的代码将是这样的:

function F = myfun(x)
if nargin<1,
    x=[0;0]
end
F = [x(1)*x(2)+exp(x(1))+x(1)-3;
     x(1)*sin(x(2))+(x(2))^2-2]
end

函数定义之后的前三行是测试函数的有用补充,无需从其他函数调用它。单独运行此功能将为您提供诸如

之类的结果
ans =

         -2.00
         -2.00

现在您可以使用优化:

x0 = [0,0];
fsolve(@myfun,x0)

这将产生没有错误的结果:

ans =

          0.56          1.21

答案 1 :(得分:1)

实际上,我在这里看到两个问题。第一个是该代码实际应该产生的异常不是:

  

未定义的功能&#39; myfun&#39;输入参数类型为&#39; double&#39;。

但:

  

使用*

时出错      

内部矩阵尺寸必须一致。

因此,除非您使用的是与我的不同的Matlab版本(2017a),并且对fsolve的内部数据验证代码进行了一致的更改......我认为您发布的代码之间存在不匹配以及您实际运行的代码。

无论如何,问题来自于你正试图解决具有两个未知数的方程组,但函数中的代码是矢量化计算和索引计算之间的混合,其间存在误差(如果你想在两个向量之间执行元素明智的乘法运算,必须使用.*运算符而不是*^同样如此)。执行完每个计算后,F的输出参数myfun必须包含不少于2个元素。

基本上,必须更改第二个等式,以便它返回单个标量,例如像这样(由您决定12的{​​{1}} {1}}在第二个等式中,因为您没有提供问题的原始表述):

x

如果使用上述函数运行代码,它将输出以下内容而不会出现错误:

function F = myfun(x)
    F = [
      x(1)*x(2)+exp(x(1))+x(1)-3;
      x(1)*sin(x(1))+(x(2))^2-2
    ];
end