matlab 使用基本函数还原反幂法迭代 求相近的特征根

%&subnorm
%反幂法 
%author(foddcus) FaFu  2022.3 
%email:foddcus@163.com
%%
%输入:目标矩阵(input);目标接近的特征值(charnum)、迭代上限(aimnum)、目标误差(errorS)
%输出:目标特征值(output);xform、zfrom,包含x、z特征向量的值。最接近的特征值

%%
%function Tresult=eliminationM(input);%模块化功能

%input输入矩阵,包括系数和参数
%inputC 用于分解LU矩阵的合成矩阵
%oringinData保留的初始矩阵
%output 输出答案,对应X的各个值
%Toutput:修正顺序后的答案,对应输入数据的X顺序
%rememberdet:行列变化中介值
%remember:行列变化记录矩阵
%xnum,ynum 输入矩阵的尺寸
%Lneed 消元中,主式需要乘的变量
%keepnum 保留小数位数
%contrastFrom(各个多项式的误差)
%deltanum:矩阵中变化的最大值
%Ldet:分解出来的下矩阵
%Udet:分解出来的上矩阵
%Zform:z特征向量值表格
%xform:包含x特征向量的表格

clear all%启用模块化后需要注释该句

input=[1,2,3;
       1,0,2
       0,1,-1];%输入矩阵
charNum=-3; %charnum范围一般比最大特征根要大,比最小特征根要小,但差距不能过大 ,否则需要提高迭代上限来弥补精度
aimnum=400;
errorS=10^(-5);
%%
oringinData=input;
error1='the condition are not meet for using this algorithm' ;
%format short%设置精度 short为精确到小数点后3位 数值型 roundn(A,3)保留3位小数
keepnum=-20;%设置保留n位小数,记得加负号表示小数位
[ynum,xnum]=size(input);%获取输入矩阵大小
if ynum~=xnum
    disp(error1)
end

Idet=charNum*eye(ynum);
input=input-Idet;

for i=1:ynum
    for j=1:ynum
        Udet(i,j)=0;
        Ldet(i,j)=0;
    end
end
inputC=input


for i=1:ynum%构造合成矩阵(行j,列I)
    for j=i:ynum  %行逻辑为主,列逻辑为辅
        for I=i:xnum%I这里做判断的算子
%             if I>j%这里需要提前做一个判断,用于加减的转变
%                 overnum=j;
%             else
%                 overnum=I;
%             end
     
            if j==i%跳过该行
            else
                if I==i
                    inputC(j,I)=roundn(inputC(j,I)/inputC(i,i),keepnum);
                else
                    inputC(j,I)=roundn(inputC(j,I)-inputC(i,I)*inputC(j,i),keepnum);
                end   
            end         
        end
    end    
end

for i=1:xnum%将合成矩阵拆分为L、U矩阵
    for j=1:ynum
        if j==i
            Ldet(j,i)=1;
            Udet(j,i)=inputC(j,i);
        end
        if j>i
            Ldet(j,i)=inputC(j,i);
        end
        if j<i&&i<4
            Udet(j,i)=inputC(j,i);
        end
    end
end

%%开始计算

X=[0;0;1];
Y=[0;0;1];       
alpa(1,1)=1;
beta(1,1)=1
for k=1:aimnum
    Y=X/alpa(k,:);
    Z=(Ldet^(-1))*Y;
    X=(Udet^(-1))*Z;
    zform(k,:)=Z;
    xform(k,:)=X;
    alpa(k+1,1)=max(max(X));
    fiv(k,1)=charNum+1/alpa(k+1,1);
   if errorS>abs(1/alpa(k+1,1)-1/alpa(k,1))
         break
   end
end
disp(["临近特征值",num2str(fiv(k,1))]);

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值