[已答复] fsolve函数,每迭代一个新的点,目标函数也会发生变化,这样的问题请教大家该如何编程

[复制链接]
ningyuanw96 发表于 2020-12-29 16:45:52
本帖最后由 ningyuanw96 于 2020-12-29 20:51 编辑

关于matlab优化求解的问题请教大家;程序报错截图如下,我分析报错的原因是迭代点(s,d1)改变时,(expect1,expect2)未改变,具体问题描述如下:
1.expect1,expect2是s,d1的函数,当fsolve函数按照优化算法找到新的点(s',d1')时,我的问题里时需要expect1,expect2也变化,这样fsolve的目标函数就也变化了;
2.根据上述1的描述,这个优化问题是否应该将(expect1,expect2)也纳入优化求解目标中去?这样该如何实现?
关于这样的编程问题思考了很久也没有编程思路,请求大家给予指导,我在代码中相应部分也对问题进行了表述,如果我的问题没有表述清楚,十分欢迎追问,先谢过大家。
  1. clc;
  2. clear all;
  3. %%%  赋值外生给定的参数  %%%
  4. wn=0.3;
  5. wt=1-wn;
  6. r=0.05;
  7. beta=1/(1+r);
  8. epislon=0.05;
  9. phi=0.3;
  10. y1=1;
  11. yn2=1;
  12. y2mean=1;
  13. y3=1;
  14. theta=0.9;

  15. % 赋值(y2,s,d1)
  16. y2=0.95:0.01:1.05;
  17. s=0.1; %给s,d1的任意初值
  18. d1=0.1;
  19. x0 =[s,d1];

  20. %在这个for循环里得到均值expect1,expect2,改变(s,d1),均值expect1,expect2也改变

  21. for i=1:1:length(y2);
  22. s=0.01;
  23. d1=0.1;

  24. %%% 判断是否紧约束 %%%
  25. standard(i)=y2(i)*((beta/(1+beta)+phi/wt/(1-phi*wn/wt))-y3/((1+beta)*(1+r)))/(beta/(1+beta)+phi*wn/wt/(1-phi*wn/wt));
  26. check(i)=d1/(1-s);
  27. if check(i)>standard(i)
  28.     ct2(i)=((1-s)*y2(i)-d1+phi*(1-s)*y2(i))/(1-phi*wn/wt);
  29.     d2(i)=phi*(1+r)*(wn/wt*ct2(i)+(1-s)*y2(i));
  30.     ct3(i)=(1-s)*y3-d2(i);
  31.     mu(i)=wt/((1-s)*y2(i)-d1+d2(i)/(1+r))-beta*wt*(1+r)/((1-s)*y3-d2(i));
  32.    
  33. else
  34.     ct2(i)=((1-s)*y2(i)-d1+(1-s)*y3/(1+r))/(1+beta);
  35.     d2(i)=((1-s)*y3-beta*(1+r)*(1-s)*y2(i)+beta*(1+r)*d1)/(1+beta);
  36.     ct3(i)=(1-s)*y3-d2(i);

  37.     mu(i)=0;
  38. end
  39. e1(i)=wt/ct2(i);%每给定一个y2(i),计算得到一个e1(i),e2(i)
  40. e2(i)=wt/ct2(i)*y2(i)+mu(i)*phi*y2(i)+beta*wt/ct3(i)*y3;

  41. %%%求均值%%%
  42. expect1=mean(e1(1,:));
  43. expect2=mean(e2(1,:));
  44. end

  45. %我的问题中,expect1,expect2实质上是s,d1的函数
  46. %在用fsolve优化求解的时候,每迭代一个新的(s,d1),都应该运行一次上述for这个循环,得到新的expect1、expect2再进行优化求解,
  47. %也即(s,d1)变化时,expect1、expect2也要变化,如此fsolve的目标函数也变化
  48. %这样一个问题没有编程思路,请求大家给予指导,如果我的问题没有表述清楚,十分欢迎追问,谢谢。

  49. [x,fval,exitflag,output,]=fsolve(@(x)foc(x,expect1,expect2),x0);

  50. function f=foc(x,expect1,expect2)
  51. wn=0.3;
  52. wt=1-wn;
  53. r=0.05;
  54. beta=1/(1+r);
  55. epislon=0.05;
  56. phi=0.3;
  57. y1=1;
  58. yn2=1;
  59. y2mean=1;
  60. y3=1;
  61. theta=0.9;
  62. s=0.01;
  63. d1=0.1;
  64. ct1=s*(1-theta)*y1+d1/(1+r);% ct1也与s,d1相关;

  65. f(1)=wt/ct1-beta*(1+r)*expect1;
  66. f(2)=wt/ct1*y1*(1-theta)-beta*expect2;
  67. end

复制代码


程序错误信息

程序错误信息
程序报错.PNG

1 条回复


wjb986555360 发表于 2021-1-7 00:12:20
你这个写的啥,你foc的函数的变量f1和f2里面x的变量呢,你这个方程写的有很大问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
热门教程
站长推荐
快速回复 返回顶部 返回列表