利用最速下降法迭代求解矩阵特征根
由于矩阵是包含拉普拉斯算子的超越矩阵,其行列式即为系统的特征式,需要用迭代方法求系统的特征根,本人用最速下降法写了一个,但求不出根,请大家指点!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);
一些标注
clcclear;
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);
回复 2楼 的帖子
有没有错误提示之类的 没有错误提示! 你的步长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]