这个错误让我抓狂!我花了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.
答案 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
个元素。
基本上,必须更改第二个等式,以便它返回单个标量,例如像这样(由您决定1
和2
的{{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