查看: 589|回复: 8|关注: 0

[已解决] 利用隐函数迭代求解数列

[复制链接]

新手

16 麦片

财富积分


050


6

主题

15

帖子

0

最佳答案
普通的迭代方程的形式常见为:
x(n+1)=f[x(n)]+b;
在编程过程中,上述方程的右端可以让我们很容易的定义一个新的以x(n)为自变量的函数如:
  1. function y=f(x)
  2. y=2*x+1;
  3. end
复制代码
这样循环代码就可以如:
  1. x(1)=0;
  2. for i=1:n
  3. x(i+1)=f(x(i));
  4. end
复制代码

但是当迭代方程为隐函数0=f(x(n),x(n+1))的时候却很难办,如:
  1. function y=f(x)
  2. y=abs(x(1)+x(2))-1;
  3. end
复制代码

如果我们只是简单地将上一次计算的结果当做下一次计算的猜测初始值:
  1. x(1)=0;
  2. for i=1:n
  3. sol=fsolve(@f,[x(i),0]);
  4. x(i+1)=sol(2);
  5. end
复制代码
但是那样是不准确的,fsolve左边同x(i+1)同时求解出的x(i)很可能和等式右边给定的初始猜解值x(i)是不一样的!

因此我需要将已知的x(i)带入隐函数f(x),使该隐函数消去一个变量x(i)二变成只关于x(i+1)的表达式,再使用fsolve求解,这样会更准确。但是这样每次fsolve的求解函数都会变,我应该怎样编程呢?

PS:该问题是从一个迭代最优的问题引申出的,为了理解简单,该问题需要用fmincon求解带等式约束的每一步的最优




论坛优秀回答者

权威

3211 麦片

财富积分



2

主题

3501

帖子

721

最佳答案
  • 关注者: 148
发表于 2018-12-15 21:14:04 | 显示全部楼层 |此回复为最佳答案
本帖最后由 maple1314168 于 2018-12-15 21:21 编辑

1.你的代码有误:
  1. options = optimoptions('fsolve','Display','off');
  2. f=@(x)abs(x(1)+x(2))-1;
  3. x(1)=0.2;n=10;
  4. for i=1:n
  5. x(i+1)=fsolve(@(t)f([x(i) t]),rand,options);
  6. end
复制代码

x =

  Columns 1 through 10

    0.2000    0.8000    0.2000    0.8000    0.2000    0.8000    0.2000    0.8000    0.2000    0.8000

  Column 11

    0.2000

这是正常的,在0.2,0.8摆动。
2.你的所谓隐函数,当然可能出现多个解。这也是很平常的。
就像上面的。x(1)+x(2)=-1的解都没有出现。因为初值(rand,改为-rand就不一样)。出现两个解的时候,你如何选择一个作下一个迭代?

新手

16 麦片

财富积分


050


6

主题

15

帖子

0

最佳答案
 楼主| 发表于 2018-12-15 22:27:56 | 显示全部楼层
maple1314168 发表于 2018-12-15 21:14
1.你的代码有误:

x =

1上述使用fsolve的例子只是为了直观,我真正的目的是使用fmincon求取每一步的最优
2.再多个可行解中选取最优的那一组作为下一个迭代的起始点

论坛优秀回答者

权威

3211 麦片

财富积分



2

主题

3501

帖子

721

最佳答案
  • 关注者: 148
发表于 2018-12-15 22:51:17 | 显示全部楼层
Stimmer 发表于 2018-12-15 22:27
1上述使用fsolve的例子只是为了直观,我真正的目的是使用fmincon求取每一步的最优
2.再多个可行解中选取 ...

1.你这样不是通常意义上的迭代。
你只是找一个符合等式的初值,但是fmincon本身会迭代,你能保证符合等式?
2.fmincon本身可以有等式约束。你这样不是多此一举?

新手

16 麦片

财富积分


050


6

主题

15

帖子

0

最佳答案
 楼主| 发表于 2018-12-17 09:41:24 | 显示全部楼层
maple1314168 发表于 2018-12-15 22:51
1.你这样不是通常意义上的迭代。
你只是找一个符合等式的初值,但是fmincon本身会迭代,你能保证符合等式 ...

1.我确实不是要进行普通意义上的迭代,而是要进行类似MPC模型预测控制中的滚动优化过程,但是因为自己的模型特殊无法使用nlmpc函数所以我需要自己编写滚动优化过程
2.正因为我强制让隐函数内的Xn代换为常数,再求解等式中的X(n+1),这样的方法比处置搜索减少了不少多余的可行解

新手

16 麦片

财富积分


050


6

主题

15

帖子

0

最佳答案
 楼主| 发表于 2018-12-17 10:30:36 | 显示全部楼层
maple1314168 发表于 2018-12-15 22:51
1.你这样不是通常意义上的迭代。
你只是找一个符合等式的初值,但是fmincon本身会迭代,你能保证符合等式 ...

另外,我实在查看matlab自带的MPC实例里面的代码的时候发现这种写法的:
  1. k = 1:Tsteps
  2.     % Obtain plant output measurements with sensor noise.
  3.     yk = xHistory(k,1:3)' + randn*0.01;
  4.     % Correct state estimation based on the measurements.
  5.     xk = correct(EKF, yk);
  6.     % Compute the control moves with reference previewing.
  7.     [uk,options] = nlmpcmove(nlobj_tracking,xk,lastMV,Xref(k:min(k+9,Tsteps),:),[],options);
  8.     % Predict the state for the next step.
  9.     predict(EKF,uk,Ts);
  10.     % Store the control move and update the last MV for the next step.
  11.     uHistory(k,:) = uk';
  12.     lastMV = uk;
  13.     % Update the real plant states for the next step by solving the
  14.     % continuous-time ODEs based on current states xk and input uk.
  15.     ODEFUN = @(t,xk) FlyingRobotStateFcn(xk,uk);
  16.     [TOUT,YOUT] = ode45(ODEFUN,[0 Ts], xHistory(k,:)');
  17.     % Store the state values.
  18.     xHistory(k+1,:) = YOUT(end,:);            
  19.     % Update the status bar.
  20.     waitbar(k/Tsteps, hbar);
  21. end
复制代码

很明显在计算ode45的前一行他把两个自变量的FlyingRobotStateFcn经过不知道怎么定义变成了一个自变量

新手

16 麦片

财富积分


050


6

主题

15

帖子

0

最佳答案
 楼主| 发表于 2018-12-17 10:46:55 | 显示全部楼层
Stimmer 发表于 2018-12-17 10:30
另外,我实在查看matlab自带的MPC实例里面的代码的时候发现这种写法的:

很明显在计算ode45的前一行他把 ...

实例在此:
  1. openExample('mpc/PlanningControlFlyingRobotExample')
复制代码

新手

16 麦片

财富积分


050


6

主题

15

帖子

0

最佳答案
 楼主| 发表于 2018-12-17 10:56:46 | 显示全部楼层
maple1314168 发表于 2018-12-15 22:51
1.你这样不是通常意义上的迭代。
你只是找一个符合等式的初值,但是fmincon本身会迭代,你能保证符合等式 ...

谢谢您,那个用匿名函数定义可变参数函数的帖子也是我写的,我明白了用隐函数迭代该怎么写了

论坛优秀回答者

权威

3211 麦片

财富积分



2

主题

3501

帖子

721

最佳答案
  • 关注者: 148
发表于 2018-12-17 11:01:28 | 显示全部楼层
Stimmer 发表于 2018-12-17 10:56
谢谢您,那个用匿名函数定义可变参数函数的帖子也是我写的,我明白了用隐函数迭代该怎么写了 ...

OK。我可能不理解你的具体是什么。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表