differential evalution code Error using * Inner matrix dimensions must agree.

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);
  1. clear all; close all; clc
  2. fs=200; %sampling freq.
  3. dt =1/fs;
  4. n=fs/3 %number of samples/cycle
  5. m=3 %no. of cycles
  6. fi=50;
  7. t = dt*(0:400); %data window
  8. ww=wgn(201,1,-40);
  9. size(transpose(ww))
  10. t =dt*(0:200);
  11. y=sin(2*pi*fi*t + 0.3);
  12. for j=0:200/(n*m)
  13. t =dt*(j*m*n:(j+1)*m*n);
  14. x=sin(2*pi*fi*t + 0.3)+transpose(wgn(1+n*m,1,-40));
  15. V=x
  16. tmax=0.01;
  17. lastreported=0;
  18. %% Problem Definition
  19. t_est=[];
  20. f_est=[];
  21. dt=1/fs;
  22. i_max=tmax*fs
  23. for ii=0:i_max
  24. if(ii/i_max*100-lastreported>=1)
  25. lastreported=ii/i_max*100;
  26. fprintf('%5.2f%%\n',lastreported);
  27. end
  28. t=(ii:ii+n-1)*dt;
  29. CostFunction=@(x) sum((minus((x(1)),V)*sin(2*pi.*x(2).*t+x(3)).^2))/n; % Cost Function
  30. nVar=3; % Number of Decision Variables
  31. VarSize=[1 nVar]; % Decision Variables Matrix Size
  32. VarMin=[0,48,0]; % Lower Bound of Decision Variables
  33. VarMax=[1000,52,2*pi]; % Upper Bound of Decision Variables
  34. %% DE Parameters
  35. MaxIt=200; % Maximum Number of Iterations
  36. nPop=50; % Population Size
  37. beta=0.5; % Scaling Factor
  38. pCR=0.2; % Crossover Probability
  39. minCost=1e-10;
  40. %% Initialization
  41. empty_individual.Position=[];
  42. empty_individual.Cost=[];
  43. BestSol.Cost=inf;
  44. pop=repmat(empty_individual,nPop,1);
  45. for i=1:nPop
  46. pop(i).Position=unifrnd(VarMin,VarMax,VarSize);
  47. pop(i).Cost=CostFunction(pop(i).Position);
  48. if pop(i).Cost<BestSol.Cost
  49. BestSol=pop(i);
  50. end
  51. end
  52. BestCost=zeros(MaxIt,1);
  53. %% DE Main Loop
  54. for it=1:MaxIt
  55. for i=1:nPop
  56. x=pop(i).Position;
  57. A=randperm(nPop);
  58. A(A==i)=[];
  59. a=A(1);
  60. b=A(2);
  61. c=A(3);
  62. % Mutation
  63. %beta=unifrnd(beta_min,beta_max);
  64. y=pop(a).Position+beta.*(pop(b).Position-pop(c).Position);
  65. y = max(y, VarMin);
  66. y = min(y, VarMax);
  67. % Crossover
  68. z=zeros(size(x));
  69. j0=randi([1 numel(x)]);
  70. for j=1:numel(x)
  71. if j==j0 || rand<=pCR
  72. z(j)=y(j);
  73. else
  74. z(j)=x(j);
  75. end
  76. end
  77. NewSol.Position=z;
  78. NewSol.Cost=CostFunction(NewSol.Position);
  79. if NewSol.Cost<pop(i).Cost
  80. pop(i)=NewSol;
  81. if pop(i).Cost<BestSol.Cost
  82. BestSol=pop(i);
  83. end
  84. end
  85. end
  86. % Update Best Cost
  87. BestCost(it)=BestSol.Cost;
  88. % Show Iteration Information
  89. %disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
  90. if(minCost>BestSol.Cost)
  91. break;
  92. ErrorTarget=0.00000001;
  93. EvalMax=10000*n;
  94. end
  95. end
  96. %% Show Results
  97. % disp(['Iteration ' num2str(ii) ': Best Cost = ' num2str(BestSol.Position(2))]);
  98. t_est=[t_est;(ii)*dt];
  99. f_est=[f_est;BestSol.Position(2)];
  100. if(minCost>BestSol.Cost)
  101. %break;
  102. ErrorTarget=0.00000001;
  103. EvalMax=10000*n;
  104. end
  105. end
  106. end
  107. t_est
  108. f_est
  109. plot (t_est,f_est,'red')
  110. hold on
  111. xlabel('time')
  112. ylabel('frequency')
  113. title('DE white noise ')
  114. c=vpa(rms(fi(t_est)-f_est))
  115. plot (t_est,fi*ones(size(t_est)))
  116. hold off

 采纳的回答

@(x)sum((minus((x(1)),V).*sin(2.*pi.*x(2).*t+x(3)).^2))/n
% ^
% |
% ------- Elementwise multiplication

19 个评论

Did you replace your function with my? I provided the corrected version.
the error :
Error using +
Matrix dimensions must agree.
Error in @(t)(sin(2*pi*fi*t+0.3)+transpose(wgn(1+n*m,1,-40)))
Error in noise_de (line 23)
V=v(t);
  1. clear all; close all; clc
  2. fs=200; %sampling freq.
  3. dt =1/fs;
  4. n=fs/3 %number of samples/cycle
  5. m=3 %no. of cycles
  6. fi=50;
  7. t = dt*(0:400); %data window
  8. v=@(t) (sin(2*pi*fi*t + 0.3)+ transpose(wgn(1+n*m,1,-40)));
  9. tmax=1;
  10. t_est=[];
  11. f_est=[];
  12. dt=1/fs;
  13. i_max=tmax*fs;
  14. for ii=0:i_max
  15. t=(ii:ii+n-1)*dt;
  16. V=v(t);
  17. CostFunction=@(x) sum((V-x(1)*sin(2*pi*x(2)*t+x(3))).^2)/n; % Cost Function
  18. nVar=3; % Number of Decision Variables
  19. VarSize=[1 nVar]; % Decision Variables Matrix Size
  20. VarMin=[0,48,0]; % Lower Bound of Decision Variables
  21. VarMax=[1000,52,2*pi]; % Upper Bound of Decision Variables
  22. %% DE Parameters
  23. MaxIt=1000; % Maximum Number of Iterations
  24. nPop=50; % Population Size
  25. beta=0.5; % Scaling Factor
  26. pCR=0.2; % Crossover Probability
  27. minCost=1e-10;
  28. %% Initialization
  29. empty_individual.Position=[];
  30. empty_individual.Cost=[];
  31. BestSol.Cost=inf;
  32. pop=repmat(empty_individual,nPop,1);
  33. for i=1:nPop
  34. pop(i).Position=unifrnd(VarMin,VarMax,VarSize);
  35. pop(i).Cost=CostFunction(pop(i).Position);
  36. if pop(i).Cost<BestSol.Cost
  37. BestSol=pop(i);
  38. end
  39. end
  40. BestCost=zeros(MaxIt,1);
  41. %% DE Main Loop
  42. for it=1:MaxIt
  43. for i=1:nPop
  44. x=pop(i).Position;
  45. A=randperm(nPop);
  46. A(A==i)=[];
  47. a=A(1);
  48. b=A(2);
  49. c=A(3);
  50. % Mutation
  51. %beta=unifrnd(beta_min,beta_max);
  52. y=pop(a).Position+beta.*(pop(b).Position-pop(c).Position);
  53. y = max(y, VarMin);
  54. y = min(y, VarMax);
  55. % Crossover
  56. z=zeros(size(x));
  57. j0=randi([1 numel(x)]);
  58. for j=1:numel(x)
  59. if j==j0 || rand<=pCR
  60. z(j)=y(j);
  61. else
  62. z(j)=x(j);
  63. end
  64. end
  65. NewSol.Position=z;
  66. NewSol.Cost=CostFunction(NewSol.Position);
  67. if NewSol.Cost<pop(i).Cost
  68. pop(i)=NewSol;
  69. if pop(i).Cost<BestSol.Cost
  70. BestSol=pop(i);
  71. end
  72. end
  73. end
  74. % Update Best Cost
  75. BestCost(it)=BestSol.Cost;
  76. % Show Iteration Information
  77. %disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
  78. if(minCost>BestSol.Cost)
  79. break;
  80. end
  81. end
  82. %% Show Results
  83. disp(['Iteration ' num2str(ii) ': Best Cost = ' num2str(BestSol.Position(2))]);
  84. t_est=[t_est;(ii+n-1)*dt];
  85. f_est=[f_est;BestSol.Position(2)];
  86. end
I did it but I discover that I am not work in the first my code
so I resend it with intial error appear
please resend it without the line numbers in front - and format it as code by using the button. We can not copy this and insert it to Matlab.
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:200); %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
t=(ii:ii+n-1)*dt;
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+n-1)*dt];
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')
hold on
xlabel('time')
ylabel('frequency')
title('DE white noise')
plot (t,fi)
hold off
I do not have communications toolbox - but you should also use elementwise multiplication here:
v=@(t) (sin(2*pi*fi.*t + 0.3)+ transpose(wgn(1+n*m,1,-40)));
% ^
% |
% ------- Fixed here
Due to the missing toolbox i cant check if this is the only problem...
when write ur code give me
Undefined function 'minus' for input arguments of type 'function_handle'.
Error in @(x)sum((minus((x(1)),V).*sin(2.*pi.*x(2).*t+x(3)).^2))/n
Error in finaldenoise (line 46)
pop(i).Cost=CostFunction(pop(i).Position);
v=@(t) (sin(2*pi*fi.*t + 0.3)+ transpose(wgn(1+n*m,1,-40)));
No minus here. Is it again the wrong function like before?
minus is here:
Error in @(x)sum((minus((x(1)),V).*sin(2.*pi.*x(2).*t+x(3)).^2))/n
thw wrong is :
Undefined function 'minus' for input arguments of type 'function_handle'.
Error in @(x)sum((minus((x(1)),V).*sin(2.*pi.*x(2).*t+x(3)).^2))/n
Error in finaldenoise (line 46)
pop(i).Cost=CostFunction(pop(i).Position);
>>
minus is here:
Error in @(x)sum((minus((x(1)),V).*sin(2.*pi.*x(2).*t+x(3)).^2))/n
thw wrong is :
Undefined function 'minus' for input arguments of type 'function_handle'.
Error in @(x)sum((minus((x(1)),V).*sin(2.*pi.*x(2).*t+x(3)).^2))/n
Error in finaldenoise (line 46)
pop(i).Cost=CostFunction(pop(i).Position);
>>
the orign code or the line contain minus :
CostFunction=@(x) sum((V-x(1)*sin(2*pi*x(2)*t+x(3))).^2)/n; % Cost Function
give me the error:
Undefined function 'minus' for input arguments of type 'function_handle'.
Error in @(x)sum((V-x(1)*sin(2*pi*x(2)*t+x(3))).^2)/n
Error in finaldenoise (line 46)
pop(i).Cost=CostFunction(pop(i).Position);
>>
i changed it by : @(x)sum((minus((x(1)),V).*sin(2.*pi.*x(2).*t+x(3)).^2))/n
but the same error
what do you get if you enter this in the command line:
test = @(x,y) minus(x,y) * 4 + x.*y
test(2,3)
result should be:
test =
function_handle with value:
@(x,y)minus(x,y)*4+x.*y
ans =
2
yes answer =2
test =
@(x,y)minus(x,y)*4+x.*y
ans =
2
what do you want to tell me?
This works for me:
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+n-1)*dt];
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')
hold on
xlabel('time')
ylabel('frequency')
title('DE white noise')
plot (t,fi)
hold off
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')

请先登录,再进行评论。

更多回答(0 个)

类别

帮助中心File Exchange 中查找有关 Gamma Functions 的更多信息

标签

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by