【问题标题】:MATLAB Initial Objective Function Evaluation ErrorMATLAB 初始目标函数评估错误
【发布时间】:2020-04-09 18:02:11
【问题描述】:

我正在尝试通过迭代关于方程组的常数 (A) 的值在 MATLAB 中创建一个绘图。我的代码粘贴在下面:

function F=Func1(X, A)

%X(1) is c
%X(2) is h 
%X(3) is lambda
%A is technology (some constant) 
%a is alpha

a=1;

F(1)=1/X(1)-X(3)

F(2)=X(3)*(X(1)-A*X(2)^a)

F(3)=-1/(24-X(2))-X(3)*A*a*X(2)^(a-1)

clear, clc

init_guess=[0,0,0]

for countA=1:0.01:10
    result(countA,:)=[countA,fsolve(@Func1, init_guess)] 
end


display('The Loop Has Ended') 
display(result) 
%plot(result(:,1),result(:,2))

第一组代码,我正在定义我试图求解的方程组。在第二组行中,我正在尝试编写一个循环,该循环遍历我想要的 A 的值,[1,10],增量为 0.01。现在,我只是想让我的循环代码工作,但我不断收到此错误:

“初始目标函数评估失败。FSOLVE 无法继续。”

我不知道为什么会这样。据我了解,这是我最初的猜测矩阵大小不正确的结果,但我相信它的大小应该是 3,因为我正在求解三个变量。此外,我相当有信心在循环代码中引用 Func1 代码的方式没有任何问题。

我们真诚地感谢大家提供的任何建议。我只在 MATLAB 上工作了几天,所以如果这是一个相当微不足道的修复,请原谅我的无知。谢谢。

【问题讨论】:

  • A 是已知常数吗?
  • 我正在尝试在给定 [1,10] 之间的每个 A 值的情况下求解我的方程组并绘制结果图,所以是的,A 是一个已知常数。
  • 如果我理解正确,那么您应该为A 的每个值使用类似fsolve(@(X) Func1(X,A), init_guess) 的内容。我的答案中的完整代码

标签: matlab


【解决方案1】:

您的代码有几个问题:

函数Func1中的1/X(1)容易被零误算除法。我会把它改成1/(X(1)+eps)

如果countA 递增0.01,则它不能用作result 的索引。也许引入一个索引ind 来增加。

我在函数中包含了您的常量A,以阐明什么是优化变量。

这是更新的代码。不知道结果是否合理:

init_guess=[0,0,0];

ind = 1;
for countA=1:0.01:10
    result(ind,:)=[countA, fsolve(@(X) Func1(X,countA), init_guess)];
    ind = ind+1;
end

display('The Loop Has Ended')
display(result) 
%plot(result(:,1),result(:,2))

function F=Func1(X,A)

%X(1) is c
%X(2) is h 
%X(3) is lambda
%A is technology (some constant) 
%a is alpha

a=1;

F(1)=1/(X(1)+eps)-X(3);

F(2)=X(3)*(X(1)-A*X(2)^a);

F(3)=-1/(24-X(2))-X(3)*A*a*X(2)^(a-1);

end

【讨论】:

  • 为匿名函数句柄和增量错误投票 +1。请拆分代码块或将脚本部分包装成一个函数,它确实是 MATLAB 中的有效文件;)
  • @max :只要您的 MATLAB 版本等于或高于 R2016b,它确实是当前格式的有效文件,请参阅here。也在我的 MATLAB 上测试过!
  • @RealReza 哇,我不知道这个。脚本中的嵌套函数....(顺便说一句,您将函数 Func1 定义为仅采用一个参数,但在定义匿名函数句柄时您提供了两个)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
相关资源
最近更新 更多