gseice 发表于 2008-6-25 16:26

利用最速下降法迭代求解矩阵特征根

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

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

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,);
   
    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);

gseice 发表于 2008-6-25 16:29

一些标注

clc
clear;
x=-1;
y=4;
z=;
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,);%梯度
   
    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);

sigma665 发表于 2008-6-25 20:24

回复 2楼 的帖子

有没有错误提示之类的

gseice 发表于 2008-6-25 22:54

没有错误提示!

Iron_001 发表于 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]
查看完整版本: 利用最速下降法迭代求解矩阵特征根