我面临着一个与每次迭代fminsearch都需要更新部分图有关的问题。
总之,在我的"main_optimization"文件中,我有这部分代码,旨在绘制要由我的模型拟合的实验数据。以下是我想在整个过程中保留的情节:
figure (1)
subplot(1,3,1)
plot(Pexp,Rexp(:,1),'ro',Pexp,Rexp(:,2),'go',Pexp,Rexp(:,3),'bo');
xlabel('P/MPa');
ylabel('rho /mol.L^{-1}');
subplot(1,3,2)
plot(Pexp,Aexp(:,1),'ro',Pexp,Aexp(:,2),'go',Pexp,Aexp(:,3),'bo');
xlabel('P/MPa');
ylabel('alpha /K^{-1}');
subplot(1,3,3)
plot(Pexp,Kexp(:,1),'ro',Pexp,Kexp(:,2),'go',Pexp,Kexp(:,3),'bo');
xlabel('P/MPa');
ylabel('k_{T} /K^{-1}');
然后,我调用 fminsearch 来优化我的模型,在我的目标函数文件中,我执行以下操作,目的是删除先前迭代的模型结果并绘制新的结果。
if ishandle(plotRHO)==1
delete(plotRHO);
end
if ishandle(plotALFA)==1
delete(plotALFA);
end
if ishandle(plotKAPPA)==1
delete(plotKAPPA);
end
subplot (1,3,1)
hold on
plotRHO=plot(Pexp,rhocalc(:,1),'r-',Pexp,rhocalc(:,2),'g-',Pexp,rhocalc(:,3),'b-');
legend(num2str(AAD_RHO),'Location','southeast');
hold off
subplot (1,3,2)
hold on
plotALFA=plot(Pexp,apcalc(:,1),'r-',Pexp,apcalc(:,2),'g-',Pexp,apcalc(:,3),'b-');
legend(num2str(AAD_AP),'Location','southeast');
hold off
subplot (1,3,3)
hold on
plotKAPPA=plot(Pexp,ktcalc(:,1),'r-',Pexp,ktcalc(:,2),'g-',Pexp,ktcalc(:,3),'b-');
legend(num2str(AAD_KT),'Location','southeast');
hold off
我尝试了不同的东西,例如使用初始绘图或 {} 初始化主文件中的 plotRHO、plotALFA、plotKAPPA,然后将它们作为目标函数的输入,这样我就可以避免在 ishandle 函数的第一次迭代中出现错误。 当我这样做时,它会删除第一个图并绘制第一次迭代的线,但随后它永远不会再次绘制或删除旧图,因为句柄始终为 0(我认为它不应该(。
如果我删除 ishandle 并只是因为我知道它们存在而删除它们,它们不会删除任何内容,并且会显示一条警告,指出找不到该对象。
始终保留我的实验点并在目标函数的每个函数评估中更新模型结果的最聪明方法是什么?它要么继续绘制每一行(并且只是在我由于(内存问题?(停止程序时打开图形(,要么只是第一次绘制,然后尽管程序正在优化,但从不更新或删除。
提前感谢您的任何帮助,
此致敬意
PS:对不起,长篇大论
更新:我真的不明白为什么,但是如果我在目标函数文件的开头将plotRHO,plotALFA和plotKAPPA定义为全局变量,则删除和replot可以按照我的意愿工作。但据我了解,应该避免全局变量,在这种情况下当然也可以
避免全局变量我实际上通过将 plotRHO、plotKAPPa 和 plotALFA 设置为我有目标函数的文件中的全局变量来解决我的问题。 我相信应该有一种更聪明的方法来做到这一点并避免使用全局变量,但我没有设法得到它。