电力仿真论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: pscad atp VIP会员
新来朋友

fy030509

yoonae

fengxian

luzhiyuan

节度使

szg0933

Iris

YANG

柔直小白

messiliu10

ywwy

18720669717

qq954646921

suoybing

EE_EDTA

zcx

wuzhixiang

chj

玉面孟尝

13647319986

晚风吻尽荷花叶

吃不胖的王胖子

荔荔

zjzy8888

dawoya

查看: 1.1K|回复: 2

prony算法问题

[复制链接]
发表于 2020-3-11 16:57:06 | 显示全部楼层 |阅读模式

注册可看大图、可下载

您需要 登录 才可以下载或查看,没有账号?立即注册

x
以下为prony算法matlab程序。
拟合实际曲线时用的算法如下图。 截图202003111654141351..png
但是这不是相当于拿原先的数据复制粘贴吗?

%打开指定文件,并对信号进行Prony分析计算
  1. function [M, Amp, Fre, damp, Pha, main_f, main_damp, x, xc, y, Amp_Response, er, all, N, dt]=x_svdprony(x_in, dt, fL, showfigure)
  2.     format long;
  3.     load input3.txt;
  4.     x_in=input3;%xlsread('shiyishi.xls');
  5.     x = x_in;
  6.     cpu=cputime;
  7.          N=size(x,1);
  8.         %取N/2的整数部分为初始的P
  9.         P=floor(N/2);

  10.         %去直流环节
  11.         x_Sum = 0;
  12.         for i=1:N
  13.             x_Sum = x_Sum + x(i);
  14.         end
  15.         x_av = x_Sum / N;
  16.     if x_av > 10E-10
  17.             for i=1:N
  18.                 x(i) = x(i) - x_av;
  19.             end
  20.     end
  21.         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  22.         %滤波环节
  23.         %fL=1;
  24.     fL=2;
  25.         if fL>1
  26.             for i=fL+1:N
  27.                 x(i-fL)=0;
  28.                 for j=1:fL
  29.                     x(i-fL) = x(i-fL)+(1/fL)*x(i-j+1);
  30.                 end
  31.             end
  32.         end
  33.         N=N-fL;
  34.         tt=0:1:N-1;
  35.         
  36.         %P要求为偶数
  37.         if mod(P, 2) ~= 0
  38.            P = P - 1;
  39.         end
  40.         
  41.         P1=P;
  42.         if mod(P, 2) == 0
  43.            % Generate R,生成样本矩阵
  44.            for i=1:P1
  45.                   for j=1:P1+1
  46.                       ss=0;
  47.                       for k=P1:N-1
  48.                         %前向预测误差
  49. %                         ss=ss+x(k+2-j,1)*x(k+1-i,1);
  50.                         %后向预测误差
  51.                         ss=ss+x(k+1-P1+i)*x(k+1-P1-1+j);
  52.                         %同时考虑双向误差
  53. %                         ss=ss+x(k+2-j,1)*x(k+1-i,1)+x(k+1-P1+i)*x(k+1-P1-1+j);              
  54.                       end   
  55.                       R(i,j)=ss;
  56.                   end
  57.            end

  58. %               divide R into R1 and R2, and get A; R1*A=R2;
  59.            for i=1:P
  60.               for j=1:P
  61.                  R1(i,j)=R(i,j+1);
  62.               end
  63.            end
  64.            for i=1:P
  65.                    R2(i)=R(i,1);
  66.            end
  67.         
  68.            %添加的代码,使用SVD-TLS算法%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  69.            %首先进行SVD分解
  70.            [u,s,v]=svd(R1);
  71.            %根据奇异值确定实际的阶数M
  72.            M=0;
  73.            %计算全部奇异值的均方和
  74.            Sum_SVD=0;
  75.            for i=1:P
  76.               Sum_SVD = Sum_SVD+s(i,i)^2;
  77.            end
  78.            cur_sum = 0;
  79.            i=1;
  80.            while 1 - sqrt(cur_sum/Sum_SVD) > 0.000001 & i<=P
  81.               cur_sum = cur_sum + s(i,i)^2;
  82.               M = M + 1;
  83.               i = i + 1;
  84.            end
  85.            %输出预测的阶数M
  86.            M;

  87.            %生成Sp矩阵
  88.            Sp=zeros(M+1, M+1);
  89.            for j=1:M
  90.               for i=1:(P-1)-M+1
  91.                  Sp = Sp+s(j,j)^2*v(i:i+M,j)*v(i:i+M,j)';
  92.               end
  93.            end
  94.         
  95.            %根据公式生成最佳最小二乘解
  96.        Sp_inv=inv(Sp);
  97.        if isinf(Sp_inv(1,1)) == 1
  98.            Sp_inv = pinv(Sp);
  99.        end

  100.            a_SVD = Sp_inv(1+1:M+1, 1)/Sp_inv(1,1);
  101.            P = M;
  102.            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  103.            % Get Zi
  104.            cof_SVD(1)=1;
  105.            for i=1:M
  106.               cof_SVD(i+1)=a_SVD(i);
  107.            end
  108.            Z=roots(cof_SVD);
  109.            
  110.        % Get y,y should be very close to x
  111.            for i=1:P
  112.               y(i)=x(i);
  113.            end
  114.         
  115.            for i=P+1:N
  116.               y(i)=0;
  117.            end
  118.            for i=P+1:N
  119.               for j=1:P
  120.                  y(i)=y(i)-a_SVD(j)*x(i-j);
  121.               end
  122.            end
  123.             
  124.            % Get B
  125.            for i=1:N
  126.               for j=1:P
  127.                  Fy(i,j)=Z(j)^(i-1);
  128.                end
  129.            end
  130.            Fz=Fy';
  131.            FH=Fy'*Fy;
  132.            Fn=inv(FH);
  133.            B = inv(Fy'*Fy)*Fy'*y';
  134.         
  135.            % Calculate Amplitude, Phasor, Frequency and damp
  136.        dt=0.01;
  137.            for i=1:P
  138.               Amp(i)=abs(B(i));
  139.               Pha(i)=atan(imag(B(i))/real(B(i)));
  140.               Fre(i)=atan(imag(Z(i))/real(Z(i)))/(2*pi*dt);
  141.               damp(i)=log(abs(Z(i)))/dt;
  142.            end

  143.        %调试用的代码
  144.        if isnan(Amp(1)) == 1
  145.            error('幅值的求解出现错误!');
  146.        end

  147.            % Get xc,verify if xc is nearly equal to x
  148.            for i=1:P
  149.                  if(real(B(i))>=0.0)
  150.                      bth(i)=Pha(i);
  151.                  else
  152.                      bth(i)=pi+Pha(i);
  153.                  end
  154.            end
  155.        %对Pha重新幅值
  156.        for i=1:P
  157.            if Pha(i) < 0
  158.                Pha(i) = Pha(i) + 2*pi;
  159.            end
  160.        end

  161.            for i=1:N
  162.                  xc(i)=0.0;
  163.                  for j=1:P
  164.                      xc(i)=xc(i)+Amp(j)*exp(damp(j)*(i-1)*dt)*cos(2*pi*Fre(j)*(i-1)*dt+bth(j));
  165.                  end
  166.            end

  167. %       if showfigure == 1
  168. %              %显示特征根的位置
  169. %              figure;
  170. %              plot(damp, 2*pi*Fre, 'r*');
  171. %       end

  172.            xj=xc';
  173.            er=0;
  174.            all = 0;
  175.            for i=1:N         
  176.                   er=er+(x(i)-xc(i))^2;
  177.                   all = all+x(i)^2;
  178.            end
  179.            SNR=-20*log(sqrt(er/all));
  180.            
  181.            % Calculate Prony spectrum
  182.            %频谱的取值范围为0-5Hz
  183.            f=0:0.01:4.99;
  184.            for j=1:size(f,2)
  185.                sptr(j)=0;
  186.                sptr1(j)=0;
  187.                sptr2(j)=0;
  188.                angl(j)=0;
  189.                tmpangle = 0;
  190.                for k=1:P
  191.                   sptr1(j)=sptr1(j)+Amp(k)*cos(bth(k))*(2*damp(k)/(damp(k)^2+(2*pi*(f(j)-Fre(k)))^2));
  192.                   sptr2(j)=sptr2(j)+Amp(k)*sin(bth(k))*(2*damp(k)/(damp(k)^2+(2*pi*(f(j)-Fre(k)))^2));
  193.                end
  194.                sptr(j)=sqrt(sptr1(j)^2+sptr2(j)^2);
  195.                tmpangle = atan2(sptr1(j),sptr2(j));
  196.                angl(j) = tmpangle*360/pi;
  197.            end
  198.        %对幅频响应进行归一化,并且寻找主导频率模式
  199.        %寻找sptr的最大值
  200.        max_sptr=0;
  201.        main_f=0;
  202.        for j=1:size(f,2)
  203.            if sptr(j) > max_sptr
  204.                max_sptr = sptr(j);
  205.                %主导频率出现在最大幅频响应位置
  206.                if f(j) ~= 0;
  207.                    main_f = f(j);
  208.                else
  209.                    max_sptr = 0;
  210.                end
  211.            end
  212.        end
  213.        main_f;
  214.        %找出真正计算的频率值
  215.        f_err = 10;
  216.        f_main = 0;
  217.        for i=1:size(Amp, 2)
  218.            if abs(main_f - Fre(i)) < f_err
  219.                f_main = Fre(i);
  220.                damp_main = damp(i);
  221.                f_err = abs(main_f - Fre(i));
  222.            end
  223.        end
  224.        main_f = f_main;
  225.        main_damp = damp_main;
  226.        %进行归一化
  227.        for j=1:size(f,2)
  228.            sptr(j)=sptr(j)/max_sptr;
  229.            Amp_Response(j) = sptr(j);
  230.        end

  231.            for i=1:size(f,2)
  232.                if angl(i) > 0
  233.                    angl(i)=angl(i)-360;
  234.                end
  235.            end
  236.            showfigure = 1;
  237.        if showfigure == 1
  238.               %在一个图上显示时域拟和曲线和Prony频谱分布
  239.               figure;
  240.               subplot(2,1,1);
  241.               %plot(tt,x(1:N),'b', tt,y, 'r', tt,xc, '*b');

  242.           plot(tt,x(1:N),'r', tt,xc, '*b');
  243.           subplot(2,1,2);
  244.               plot(f,sptr);
  245.               %subplot(2,2,3);
  246.               %plot(f,sptr);
  247.               %subplot(2,2,4);
  248.               %plot(f,angl);
  249.       end

  250.           cpu=cputime-cpu;
  251.       format short;
  252.         end

复制代码


回复

使用道具 举报

发表于 2020-3-11 19:06:25 | 显示全部楼层
老哥,可以交流下吗,我qq257589181。感激不尽
回复

使用道具 举报

 楼主| 发表于 2020-3-18 11:53:59 | 显示全部楼层
有什么问题可以在这里说,我懂得就会讲啦
回复

使用道具 举报

发贴规则: 
1.严禁将帖子发至无关版面,请选择对应版块发贴,以维护论坛的系统性和整洁性。
2.提问题需要将问题描述清楚,涉及到仿真模型问题需要添加报错图片或描述,上传仿真模型效果更佳。
3.由于论坛的时效性不足,可以发帖后点击楼层下分享到:QQ好友和群快速得到关注。
4.保持和谐。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|电力仿真论坛

GMT+8, 2024-4-27 14:22 , Processed in 0.097414 second(s), 45 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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