声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1238|回复: 4

[综合讨论] 利用最速下降法迭代求解矩阵特征根

[复制链接]
发表于 2008-6-25 16:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
由于矩阵是包含拉普拉斯算子的超越矩阵,其行列式即为系统的特征式,需要用迭代方法求系统的特征根,本人用最速下降法写了一个,但求不出根,请大家指点!

clc
clear;
x=-1;
y=4;
z=[x y];

syms s

A(1,1)=cosh(s);

A(2,2)=s^2+2*s+4;

    a=det(A);
   
    syms v1 v2;
   
    a1=subs(a,s,v1+v2*i);
   
    a2=subs(a,s,v1-v2*i);
   
    b=(a1-a2)/2/i;
   
    c=(a1+a2)/2;
   
    f=b^2+c^2;
   
    grad=jacobian(f,[v1 v2]);
   
    grad_value=subs(grad,{v1 v2},z);
   
    eps=0.1;
   
    n=1;
   
    while norm(grad_value)>eps
      
        
        dk=-grad_value;
        
        ak=grad_value*dk'/(grad_value(1)*grad_value(2)-2*grad_value(1)^2-2*grad_value(2)^2);
      
        z=z+ak*dk;
      
        grad_value=subs(grad,{v1,v2},z);
        
        n=n+1;
        if (n>10000)
             disp('跌代步数太多,不收敛!');
             return;
         end
    end
   
   x=z(1);
   y=z(2);
回复
分享到:

使用道具 举报

 楼主| 发表于 2008-6-25 16:29 | 显示全部楼层

一些标注

clc
clear;
x=-1;
y=4;
z=[x y];
syms s

A(1,1)=cosh(s);  %双曲余弦函数

A(2,2)=s^2+2*s+4;

    a=det(A);   %行列式
   
    syms v1 v2;
   
    a1=subs(a,s,v1+v2*i);
   
    a2=subs(a,s,v1-v2*i);
   
    b=(a1-a2)/2/i;   %%获得特征式的虚部
   
    c=(a1+a2)/2;     %%获得特征式的实部
   
    f=b^2+c^2;      %目标函数
   
    grad=jacobian(f,[v1 v2]);  %梯度
   
    grad_value=subs(grad,{v1 v2},z);
   
    eps=0.1;
   
    n=1;
   
    while norm(grad_value)>eps
      
        
        dk=-grad_value;
        
        ak=grad_value*dk'/(grad_value(1)*grad_value(2)-2*grad_value(1)^2-2*grad_value(2)^2);
      
        z=z+ak*dk;
      
        grad_value=subs(grad,{v1,v2},z);
        
        n=n+1;
        if (n>10000)
             disp('跌代步数太多,不收敛!');
             return;
         end
    end
   
   x=z(1);
   y=z(2);
发表于 2008-6-25 20:24 | 显示全部楼层

回复 2楼 的帖子

有没有错误提示之类的
 楼主| 发表于 2008-6-25 22:54 | 显示全部楼层
没有错误提示!
发表于 2008-6-29 10:28 | 显示全部楼层
你的步长ak的取法可能有问题.
精确线性搜索应该是寻找使f(z+ak*dk)达到最小值的ak.
非精确线性搜索一般使用回朔算法比较好。
求ak使f(z+ak*dk)<f(z)+rou*ak*grad_value'*dk 其中0<rou<1.一般是选取ak=1,然后选取因子beta<1(例如0.2)让ak=ak*beta是上面的式子满足的第一个ak.

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-29 04:51 , Processed in 0.075088 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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