- 阅读权限
- 255
- 威望
- 0 级
- 论坛币
- 0 个
- 通用积分
- 0
- 学术水平
- 0 点
- 热心指数
- 0 点
- 信用等级
- 0 点
- 经验
- 166 点
- 帖子
- 15
- 精华
- 0
- 在线时间
- 11 小时
- 注册时间
- 2011-5-9
- 最后登录
- 2011-5-17
初中生
还不是VIP/贵宾
- 威望
- 0 级
- 论坛币
 - 0 个
- 通用积分
- 0
- 学术水平
- 0 点
- 热心指数
- 0 点
- 信用等级
- 0 点
- 经验
- 166 点
- 帖子
- 15
- 精华
- 0
- 在线时间
- 11 小时
- 注册时间
- 2011-5-9
- 最后登录
- 2011-5-17
|
7论坛币
|
接我昨天写的那个帖子,我先附件上非线性优化的问题,见附件1。问题就是用matlab实现SQP优化算出转移概率矩阵的每个元素。这个非线性优化问题每个变量的含义我在我上个帖子上说明了,见链接https://bbs.pinggu.org/thread-1096366-1-1.html地址。
我今天专门找我师兄请教了一个上午,他写了一个算法,能求出结果,但是结果不满意,我想请大家参考一下该如何修改代码使结果满意。
代码如下:
- function f=ld(x)
- A=[1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 32
- 15 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 10 1 0 0 0 0 2 5
- 17 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 1 0 1 0 0 1 9 0 0 0 0 0 0 0
- 1 1 0 0 0 0 1 13 1 0 0 0 0 2 8 2 0 0 0 0 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 12 0 0 1 0 0 0 0 0 0 0 0 0 0 7 2 0 0 0 0 2 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 15 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 18 0 0 0 0 0 0 0
- 11 1 0 1 0 0 0 3 1 0 0 0 0 0 4 2 0 0 1 0 1 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 1 0 1 0 0 0 0 0 0 0 0 0 1 0 3 2 0 0 0 0 3 20 1 0 0 0 0 1 2 0 0 0 0 0 0 0
- 1 0 0 0 1 0 0 0 0 0 0 0 0 0 4 1 0 0 0 0 0 2 1 0 1 0 0 0 24 0 0 0 0 0 0 0
- 3 0 0 0 1 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 1 25 0 0 0 0 0 1 0 0 0 0 0 0 0 0
- 1 0 0 1 0 0 0 1 1 1 0 0 0 0 2 1 0 0 1 1 0 10 3 0 0 0 0 3 9 0 0 0 0 0 0 0
- 5 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 5 2 0 1 1 0 1 16 0 0 0 0 0 0 0
- 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 16 3 1 0 0 0 2 9
- 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 7 3 0 1 0 0 2 18 0 0 0 0 1 0 0
- 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 1 1 1 0 0 0 7 0 0 0 0 1 0 0
- 2 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 1 1 1 0 0 1 22
- ];
- for j=1:16
- for i=1:36
- B(j,i)=x(i)*A(j,i);
- end
- end
- f=sum(B(:));
- f=-f;
- Aeq=[ones(1,6) zeros(1,30)
- zeros(1,6) ones(1,6) zeros(1,24)
- zeros(1,12) ones(1,6) zeros(1,18)
- zeros(1,18) ones(1,6) zeros(1,12)
- zeros(1,24) ones(1,6) zeros(1,6)
- zeros(1,30) ones(1,6)];
- beq=[1
- 1
- 1
- 1
- 1
- 1];
- x0=[0.999999999994889 0.000000000001012 0.000000000001003 0.000000000001022 0.000000000001052 0.000000000001022 0.000000000008805 0.999999999883916 0.000000000080863 0.000000000008805 0.000000000008805 0.000000000008805 0.000000000001417 0.000000000001502 0.999999999990798 0.000000000003448 0.000000000001417 0.000000000001417 0.00000000000095 0.000000000000942 0.000000000001011 0.999999999995115 0.00000000000104 0.000000000000942 0.000000000000833 0.000000000000797 0.000000000000797 0.000000000000846 0.999999999995906 0.000000000000821 0.000000000001329 0.000000000001295 0.000000000001278 0.000000000001312 0.000000000001365 0.999999999993421
- ];
- lb=zeros(1,36);
- options = optimset('LargeScale','off')
- [x(1,:),fval]=fmincon(@ld,x0,[],[],Aeq,beq,lb,[],[],options)
复制代码
x0即为最终所求的转移概率矩阵,但是结果不好, 有6个元素过分接近1,其他的元素全都非常小,不符合我论文选取的数据实际情况,想请大家看看代码该如何修改。
另外我参考股票估价的马尔科夫链模型的方法求出了该转移概率矩阵的一个近似结果,结果不一定好,但是用SQP优化得到最优解应该和我这种方法求出的矩阵差别不大,我想要的是这种结果。
- 完美结果
- π=[0.8706 0.0172 0.0086 0.0259 0.0517 0.0517
- 0.04 0.72 0.16 0.04 0.04 0.04
- 0.0208 0.0417 0.6667 0.2292 0.0208 0.0208
- 0.0149 0.0075 0.0672 0.8134 0.0896 0.0075
- 0.0449 0.0064 0.0064 0.0577 0.859 0.0321
- 0.0379 0.0126 0.001 0.0253 0.0632 0.86]
复制代码
上面这个矩阵就是我用另外一种学术水平低的方法求出的,即非常简单的古典概率方法,我想,这个结果即使不是最好的,但一定是对的,优化的矩阵结果应该和这个差不多才对,而不是上面那段代码求出的瑕疵结果。
由于论文需要我还是想用SQP方法求出矩阵,我的论坛币不多,我已经拿出了所有的论坛币表示一下诚意及对思考我这个问题的各位专家表示万分感谢!!!! |
|