differential evalution code Error using * Inner matrix dimensions must agree.
    8 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    common fernando
 el 2 de Dic. de 2020
  
Error in @(x)sum((minus((x(1)),V)*sin(2.*pi.*x(2).*t+x(3)).^2))/n   Error in noise_de (line 56)             pop(i).Cost=CostFunction(pop(i).Position);
- clear all; close all; clc
- fs=200; %sampling freq.
- dt =1/fs;
- n=fs/3 %number of samples/cycle
- m=3 %no. of cycles
- fi=50;
- t = dt*(0:400); %data window
- ww=wgn(201,1,-40);
- size(transpose(ww))
- t =dt*(0:200);
- y=sin(2*pi*fi*t + 0.3);
- for j=0:200/(n*m)
- t =dt*(j*m*n:(j+1)*m*n);
- x=sin(2*pi*fi*t + 0.3)+transpose(wgn(1+n*m,1,-40));
- V=x
- tmax=0.01;
- lastreported=0;
- %% Problem Definition
- t_est=[];
- f_est=[];
- dt=1/fs;
- i_max=tmax*fs
- for ii=0:i_max
- if(ii/i_max*100-lastreported>=1)
- lastreported=ii/i_max*100;
- fprintf('%5.2f%%\n',lastreported);
- end
- t=(ii:ii+n-1)*dt;
- CostFunction=@(x) sum((minus((x(1)),V)*sin(2*pi.*x(2).*t+x(3)).^2))/n; % Cost Function
- nVar=3; % Number of Decision Variables
- VarSize=[1 nVar]; % Decision Variables Matrix Size
- VarMin=[0,48,0]; % Lower Bound of Decision Variables
- VarMax=[1000,52,2*pi]; % Upper Bound of Decision Variables
- %% DE Parameters
- MaxIt=200; % Maximum Number of Iterations
- nPop=50; % Population Size
- beta=0.5; % Scaling Factor
- pCR=0.2; % Crossover Probability
- minCost=1e-10;
- %% Initialization
- empty_individual.Position=[];
- empty_individual.Cost=[];
- BestSol.Cost=inf;
- pop=repmat(empty_individual,nPop,1);
- for i=1:nPop
- pop(i).Position=unifrnd(VarMin,VarMax,VarSize);
- pop(i).Cost=CostFunction(pop(i).Position);
- if pop(i).Cost<BestSol.Cost
- BestSol=pop(i);
- end
- end
- BestCost=zeros(MaxIt,1);
- %% DE Main Loop
- for it=1:MaxIt
- for i=1:nPop
- x=pop(i).Position;
- A=randperm(nPop);
- A(A==i)=[];
- a=A(1);
- b=A(2);
- c=A(3);
- % Mutation
- %beta=unifrnd(beta_min,beta_max);
- y=pop(a).Position+beta.*(pop(b).Position-pop(c).Position);
- y = max(y, VarMin);
- y = min(y, VarMax);
- % Crossover
- z=zeros(size(x));
- j0=randi([1 numel(x)]);
- for j=1:numel(x)
- if j==j0 || rand<=pCR
- z(j)=y(j);
- else
- z(j)=x(j);
- end
- end
- NewSol.Position=z;
- NewSol.Cost=CostFunction(NewSol.Position);
- if NewSol.Cost<pop(i).Cost
- pop(i)=NewSol;
- if pop(i).Cost<BestSol.Cost
- BestSol=pop(i);
- end
- end
- end
- % Update Best Cost
- BestCost(it)=BestSol.Cost;
- % Show Iteration Information
- %disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
- if(minCost>BestSol.Cost)
- break;
- ErrorTarget=0.00000001;
- EvalMax=10000*n;
- end
- end
- %% Show Results
- % disp(['Iteration ' num2str(ii) ': Best Cost = ' num2str(BestSol.Position(2))]);
- t_est=[t_est;(ii)*dt];
- f_est=[f_est;BestSol.Position(2)];
- if(minCost>BestSol.Cost)
- %break;
- ErrorTarget=0.00000001;
- EvalMax=10000*n;
- end
- end
- end
- t_est
- f_est
- plot (t_est,f_est,'red')
- hold on
- xlabel('time')
- ylabel('frequency')
- title('DE white noise ')
- c=vpa(rms(fi(t_est)-f_est))
- plot (t_est,fi*ones(size(t_est)))
- hold off
0 comentarios
Respuesta aceptada
  Stephan
      
      
 el 2 de Dic. de 2020
        @(x)sum((minus((x(1)),V).*sin(2.*pi.*x(2).*t+x(3)).^2))/n
%                       ^
%                       |
%                       ------- Elementwise multiplication
19 comentarios
  Stephan
      
      
 el 3 de Dic. de 2020
				
      Editada: Stephan
      
      
 el 3 de Dic. de 2020
  
			The problem is here:
t_est=[t_est;(ii+n-1)*dt];
this leads to values of t_est ranging from 0...1 - not 0...200 as expected. If you change it to:
t_est=[t_est; (ii-1)*dt*fs];
The values are scaled 0...200. But due to missing insight in the problem i dont know if this is correct. At least the plot seems to be ok.
Since fi is  ascalar, it wont plot - i suggest to use yline instead:
plot(t_est,f_est,'red')
xlim([0 200])
yline(fi)
xlabel('time')
ylabel('frequency')
title('DE white noise')

So once again the whole code:
clear all; close all; clc
fs=200;     %sampling freq.
dt =1/fs;
n=fs/3	%number of samples/cycle
m=3        %no. of cycles
fi=50;
t = linspace(0,200,1+n*m); %data window
v=@(t) (sin(2*pi*fi.*t + 0.3)+ transpose(wgn(1+n*m,1,-40)));
tmax=1;
t_est=[];
f_est=[];
dt=1/fs;
i_max=tmax*fs;
for ii=0:i_max
    V=v(t);
    CostFunction=@(x) sum((V-x(1)*sin(2*pi*x(2)*t+x(3))).^2)/n;    % Cost Function
    nVar=3;            % Number of Decision Variables
    VarSize=[1 nVar];   % Decision Variables Matrix Size
    VarMin=[0,48,0];          % Lower Bound of Decision Variables
    VarMax=[1000,52,2*pi];          % Upper Bound of Decision Variables
    %% DE Parameters
    MaxIt=1000;      % Maximum Number of Iterations
    nPop=50;        % Population Size
    beta=0.5;       % Scaling Factor
    pCR=0.2;        % Crossover Probability
    minCost=1e-10;
    %% Initialization
    empty_individual.Position=[];
    empty_individual.Cost=[];
    BestSol.Cost=inf;
    pop=repmat(empty_individual,nPop,1);
    for i=1:nPop
        pop(i).Position=unifrnd(VarMin,VarMax,VarSize);
        pop(i).Cost=CostFunction(pop(i).Position);
        if pop(i).Cost<BestSol.Cost
            BestSol=pop(i);
        end
    end
    BestCost=zeros(MaxIt,1);
    %% DE Main Loop
    for it=1:MaxIt
        for i=1:nPop
            x=pop(i).Position;
            A=randperm(nPop);
            A(A==i)=[];
            a=A(1);
            b=A(2);
            c=A(3);
            % Mutation
            %beta=unifrnd(beta_min,beta_max);
            y=pop(a).Position+beta.*(pop(b).Position-pop(c).Position);
            y = max(y, VarMin);
            y = min(y, VarMax);
            % Crossover
            z=zeros(size(x));
            j0=randi([1 numel(x)]);
            for j=1:numel(x)
                if j==j0 || rand<=pCR
                    z(j)=y(j);
                else
                    z(j)=x(j);
                end
            end
            NewSol.Position=z;
            NewSol.Cost=CostFunction(NewSol.Position);
            if NewSol.Cost<pop(i).Cost
                pop(i)=NewSol;
                if pop(i).Cost<BestSol.Cost
                    BestSol=pop(i);
                end
            end
        end
        % Update Best Cost
        BestCost(it)=BestSol.Cost;
        % Show Iteration Information
        %disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
        if(minCost>BestSol.Cost)
            break;
        end
    end
    %% Show Results
    disp(['Iteration ' num2str(ii) ': Best Cost = ' num2str(BestSol.Position(2))]);
    t_est=[t_est; (ii-1)*dt*fs];
    f_est=[f_est;BestSol.Position(2)];
end
t_est
f_est
RMSE = sqrt(mean((f_est-fi).^2))
plot(t_est,f_est,'red')
xlim([0 200])
yline(fi)
xlabel('time')
ylabel('frequency')
title('DE white noise')
Más respuestas (0)
Ver también
Categorías
				Más información sobre Gamma Functions en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


