www.gusucode.com > matlab编程遗传算法计算匹配电路源码程序 > code1/code/MATLAB源代码/bandpassS21_test5.m
function [S21_Difference] = bandpassS21_test5(Chrom,num_integer,num_parameter,gen) %UNTITLED3 此处显示有关此函数的摘要 % 此处显示详细说明 column_of_compoment=num_integer+1:num_integer+num_integer*num_parameter; %代表元件值的基因所在列的列标号 %column_of_compoment=[6 7 8 9 10 11 12 13 14 15]; %代表元件值的基因所在列的列标号 %num_of_component=length(column_of_compoment); %元件的个数 num_structure=1:num_integer; %单元结构的标号 %num_structure=[1 2 3 4 5]; %单元结构的标号 [num_of_individual,~]=size(Chrom); %提取出种群的个体数目和变量数 %frequency_1GHz=[1.9 1.92 1.94 1.96 1.98 2 2.02 2.04 2.06 2.08 2.1 ... %0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 ... %2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 ... %4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.0]; %设置需要计算的频率点 frequency_10GHz=0.1.*[1.80 1.82 1.84 1.86 1.88 1.90 1.92 1.94 1.96 1.98 2.00 2.02 2.04 2.06 2.08 2.10 ... 3.30 3.32 3.34 3.36 3.38 3.40 3.42 3.44 3.46 3.48 3.50 3.52 3.54 3.56 3.58 3.60 ... 5.45 5.50 5.55 5.60 5.65 5.70 5.75 5.80 5.85 5.90 5.95 ... 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 ... 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 ... 3.9 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.0 5.1 ... 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7.0 7.1]; expectations_of_S21=crtbase([43 50],[0 60])'; num_of_point=length(frequency_10GHz); %用于计算的频率点的数目 ABCD=zeros(2,2,num_of_individual,num_of_point); %预先给ABCD矩阵分配内存空间 for f=1:num_of_point %频率点循环 for k=1:num_of_individual %个体循环 ABCD(:,:,k,f)=eye(2); structure=zeros(2,2,num_integer); %预先给structure矩阵分配内存空间,共包括num_integer个单元结构 for m=1:num_integer increment=(m-1)*num_parameter; Z01=Chrom(k,column_of_compoment(1+increment)); electrical_length1=Chrom(k,column_of_compoment(2+increment))/360*2*pi*frequency_10GHz(f); Z02=Chrom(k,column_of_compoment(3+increment)); electrical_length2=Chrom(k,column_of_compoment(4+increment))/360*2*pi*frequency_10GHz(f); w=(Chrom(k,column_of_compoment(1+increment))-32)/(147-32)*(4-0.2)+0.2; s=(Chrom(k,column_of_compoment(3+increment))-32)/(147-32)*(2-0.2)+0.2; couple_electrical_length=electrical_length1; switch Chrom(k,num_structure(m)) %判断单元电路的结构 case 0 %0代表空单元 A=1; B=0; C=0; D=1; case 1 %1代表传输线 A=cos(electrical_length1); B=1i*Z01*sin(electrical_length1); C=1i*sin(electrical_length1)/Z01; D=cos(electrical_length1); case 2 %2代表开路并联传输线 A=1; B=0; C=1i*tan(electrical_length1)/Z01; D=1; case 3 %3代表短路并联传输线 A=1; B=0; C=1/(1i*Z01*tan(electrical_length1)); D=1; case 4 %4代表两段的开路并联传输线 A=1; B=0; C=1i*(Z02*tan(electrical_length1)+Z01*tan(electrical_length2))/(Z02*(Z01-Z02*tan(electrical_length1)*tan(electrical_length2))); D=1; case 5 %5代表两段的短路并联传输线 A=1; B=0; C=(Z02-Z01*tan(electrical_length1)*tan(electrical_length2))/(1i*Z02*(Z01*tan(electrical_length1)+Z02*tan(electrical_length2))); D=1; case 6 %6代表 x=[w;s]; y=Odd_even_mode_impedance_calculation(x); Z0e=y(1); Z0o=y(2); Z11=-1i*(Z0e+Z0o)/2*cot(couple_electrical_length); Z12=-1i*(Z0e-Z0o)/2*csc(couple_electrical_length); Z21=Z12; Z22=Z11; ZZ=Z11*Z22-Z12*Z21; A=Z11/Z21; B=ZZ/Z21; C=1/Z21; D=Z22/Z21; case 7 %7代表 x=[w;s]; y=Odd_even_mode_impedance_calculation(x); Z0e=y(1); Z0o=y(2); Z11=-1i*(Z0e+Z0o)/2*cot(couple_electrical_length); Z12=-1i*(Z0e-Z0o)/2*cot(couple_electrical_length); Z21=Z12; Z22=Z11; ZZ=Z11*Z22-Z12*Z21; A=Z11/Z21; B=ZZ/Z21; C=1/Z21; D=Z22/Z21; case 8 %8代表传输线 A1=cos(electrical_length1); B1=1i*Z01*sin(electrical_length1); C1=1i*sin(electrical_length1)/Z01; D1=cos(electrical_length1); A2=cos(electrical_length2); B2=1i*Z02*sin(electrical_length2); C2=1i*sin(electrical_length2)/Z02; D2=cos(electrical_length2); ABCD1=[A1 B1;C1 D1]; ABCD2=[A2 B2;C2 D2]; ABCD_=ABCD1*ABCD2*ABCD1; A=ABCD_(1,1); B=ABCD_(1,2); C=ABCD_(2,1); D=ABCD_(2,2); Y11=D/B; Y12=(B*C-A*D)/B; Y21=-1/B; Y22=A/B; Y11=2*Y11; Y12=2*Y12; Y21=2*Y21; Y22=2*Y22; A=-Y22/Y21; B=-1/Y21; C=-(Y11*Y22-Y12*Y21)/Y21; D=-Y11/Y21; end structure(:,:,m)=[A B;C D]; ABCD(:,:,k,f)=ABCD(:,:,k,f)*structure(:,:,m); end end end S21_all=zeros(num_of_point,num_of_individual); S11_all=zeros(num_of_point,num_of_individual); polar_point=zeros(num_of_point,num_of_individual); zero_point=zeros(num_of_point,num_of_individual); for f=1:num_of_point S21_all(f,:)=-20*log10(abs(2./(squeeze(ABCD(1,1,:,f))+squeeze(ABCD(1,2,:,f))/50+squeeze(ABCD(2,1,:,f))*50+squeeze(ABCD(2,2,:,f))))); %由ABCD矩阵计算S21 if f<44 S11_all(f,:)=-20*log10(abs((squeeze(ABCD(1,1,:,f))+squeeze(ABCD(1,2,:,f))/50-squeeze(ABCD(2,1,:,f))*50-squeeze(ABCD(2,2,:,f)))./(squeeze(ABCD(1,1,:,f))+squeeze(ABCD(1,2,:,f))/50+squeeze(ABCD(2,1,:,f))*50+squeeze(ABCD(2,2,:,f))))); polar_point(f,:)=20*log10(abs((squeeze(ABCD(1,1,:,f))+squeeze(ABCD(1,2,:,f))/50+squeeze(ABCD(2,1,:,f))*50+squeeze(ABCD(2,2,:,f))))-2); end if (f==58)||(f==59)||(f==71)||(f==72)||(f==84)||(f==85) zero_point(f,:)=40*log10(abs(squeeze(ABCD(1,1,:,f)).*squeeze(ABCD(2,2,:,f))-squeeze(ABCD(1,2,:,f)).*squeeze(ABCD(2,1,:,f)))); end end S21_Difference=zeros(num_of_individual,1); S21_passband=zeros(1,num_of_individual); S21_stopband=zeros(1,num_of_individual); for k=1:num_of_individual S21_passband(k)=max(S21_all(1:43,k)); %通带的最大插损 S21_stopband(k)=min(S21_all(44:num_of_point,k)); %阻带的最小抑制 m=0.8; S21_Difference(k,1)=S21_passband(k)-S21_stopband(k); %S21_Difference(k,1)=S21_passband(k)-S21_stopband(k); %S21_Difference(k,1)=10*sum((S21_all(1:13,k)-expectations_of_S21(1:13)).^2)+0.1*sum((S21_all(14:num_of_point,k)-expectations_of_S21(14:num_of_point)).^2)+10*sum((S21_all(48:49,k)-expectations_of_S21(48:49)).^2);%+10*(S21_passband(k)-S21_stopband(k)); %S21_Difference(k,1)=sum((S21_all(1:11,k)-expectations_of_S21(1:11)).^2)+0.1*sum((S21_all(12:num_of_point,k)-expectations_of_S21(12:num_of_point)).^2);%+sum((S21_all(27:28,k)-expectations_of_S21(27:28)).^2); %S21_Difference(k,1)=10*sum((S11_all(1:11,k)-expectations_of_S11(1:11)).^2)+0.1*sum((S21_all(12:num_of_point,k)-expectations_of_S21(12:num_of_point)).^2)+10*sum((S21_all(46:47,k)-expectations_of_S21(46:47)).^2); %if (gen>99)&&(rem(gen,10)==0) % if S21_passband(k)>3 % m=m+0.1; % else if S21_stopband(k)<30 % m=m-0.1; % end % end %end % for f=1:43 % if S21_all(f,k)>3 % S21_Difference(k,1)=S21_Difference(k,1)+15*m*(S21_all(f,k)-expectations_of_S21(f)).^2; % else S21_Difference(k,1)=S21_Difference(k,1)+m*(S21_all(f,k)-expectations_of_S21(f)).^2; % end % if (f==4)||(f==7)||(f==10)||(f==13)||(f==20)||(f==23)||(f==26)||(f==29)||(f==35)||(f==38)||(f==41)||(f==4) % if S11_all(f,k)<20 % S21_Difference(k,1)=S21_Difference(k,1)+5*m*(S11_all(f,k)-20).^2; % else S21_Difference(k,1)=S21_Difference(k,1); % end % if polar_point(f,k)>-50 % S21_Difference(k,1)=S21_Difference(k,1)+polar_point(f,k); % else S21_Difference(k,1)=S21_Difference(k,1)-50; % end % else if S11_all(f,k)<15 % S21_Difference(k,1)=S21_Difference(k,1)+5*m*(S11_all(f,k)-15).^2; % else S21_Difference(k,1)=S21_Difference(k,1); % end % end % end % for f=44:num_of_point % if S21_all(f,k)>60 % S21_Difference(k,1)=S21_Difference(k,1); % else if S21_all(f,k)<30 % S21_Difference(k,1)=S21_Difference(k,1)+(S21_all(f,k)-expectations_of_S21(f))^2; % else S21_Difference(k,1)=S21_Difference(k,1)+0.1*(S21_all(f,k)-expectations_of_S21(f))^2; % end % end % if zero_point(f,k)<-500 % S21_Difference(k,1)=S21_Difference(k,1)-500; % else S21_Difference(k,1)=S21_Difference(k,1)+zero_point(f,k); % end % end % for f=[58 59 71 72 84 85] % S21_Difference(k,1)=S21_Difference(k,1)-S21_all(f,k)^2; % end end end