好 呵呵:)
我还是把程序贴出来吧。
% 对分法找值
%下面是定义输入值
clear all
L=0.01;
neff=1.447;
c=1*1e-7/(2*neff);
deltaneff=0.0004;
N=100;
M=2000;
lamda1=1548;
lamda2=1552;
lamda=linspace(lamda1*1e-9,lamda2*1e-9,M);
deltalamda=(lamda2*1e-9-lamda1*1e-9)/(M-1);
nn = 1;
delta = 1e-4;
% 这里开始使用传输矩阵法计算每个波长对应的正向和反向波振幅
%传输矩阵部分借用网上一位仁兄的程序,在此谢过!
for k=1:M %不同的光波长
F=[1,0;0,1]; %传输矩阵初始值
checl_M = k
% 对分法找根
aaa1 = 0; %假设AF(Z)在Z=L处的根为0
for n=1:N %for循环内计算传输矩阵
deltaneff_z=deltaneff;
lamdaD=1550*1e-9-L*neff*c+2*neff*c*(L*n/N-0.5*L/N);
sigma=2*pi*neff*(1/lamda(k)-1/lamdaD)+2*pi*deltaneff_z/lamda(k)+(4*pi*neff)*c*(2*(neff+deltaneff))*(-L/2+n*L/N)/lamdaD^2;
kac=pi*deltaneff_z/lamda(k);
RB=sqrt(kac^2-sigma^2)+eps;
F=F*[cosh(RB*L/N)-(sigma/RB)*sinh(RB*L/N)*1i,-(kac/RB)*sinh(RB*L/N)*1i;(kac/RB)*sinh(RB*L/N)*1i,cosh(RB*L/N)+(sigma/RB)*sinh(RB*L/N)*1i];
end %传输矩阵计算结束
MID = F*[aaa1;0]; %计算Z=0处,AF和AB的值
RR1 = MID(1,1); %RR就是AF的值
chec1 = abs(RR1)-1; %由于已知AF在Z=0处的初始值为1,因此计算差值,相当于一楼里说的H(X)-IN
aaa2 = 1; %下面假设AF(Z)在Z=L处的根为1
for n=1:N %同样是传输矩阵
deltaneff_z=deltaneff;
lamdaD=1550*1e-9-L*neff*c+2*neff*c*(L*n/N-0.5*L/N);
sigma=2*pi*neff*(1/lamda(k)-1/lamdaD)+2*pi*deltaneff_z/lamda(k)+(4*pi*neff)*c*(2*(neff+deltaneff))*(-L/2+n*L/N)/lamdaD^2;
kac=pi*deltaneff_z/lamda(k);
RB=sqrt(kac^2-sigma^2)+eps;
F=F*[cosh(RB*L/N)-(sigma/RB)*sinh(RB*L/N)*1i,-(kac/RB)*sinh(RB*L/N)*1i;(kac/RB)*sinh(RB*L/N)*1i,cosh(RB*L/N)+(sigma/RB)*sinh(RB*L/N)*1i];
end %传输矩阵计算结束
MID = F*[aaa2;0];
RR2 = MID(1,1);
chec2 = abs(RR2)-1; %计算另一个假设值对应的插值
while(1) %进行对分
if chec1*chec2>0 %没有根的情况
k = k
fpringt('没有根')
break
end
aaa3 = (aaa1+aaa2)/2; %如果有根,则进行对分
for n=1:N %传输矩阵
deltaneff_z=deltaneff;
lamdaD=1550*1e-9-L*neff*c+2*neff*c*(L*n/N-0.5*L/N);
sigma=2*pi*neff*(1/lamda(k)-1/lamdaD)+2*pi*deltaneff_z/lamda(k)+(4*pi*neff)*c*(2*(neff+deltaneff))*(-L/2+n*L/N)/lamdaD^2;
kac=pi*deltaneff_z/lamda(k);
RB=sqrt(kac^2-sigma^2)+eps;
F=F*[cosh(RB*L/N)-(sigma/RB)*sinh(RB*L/N)*1i,-(kac/RB)*sinh(RB*L/N)*1i;(kac/RB)*sinh(RB*L/N)*1i,cosh(RB*L/N)+(sigma/RB)*sinh(RB*L/N)*1i];
end %矩阵计算结束
MID = F*[aaa3;0];
RR3 = MID(1,1);
chec3 = abs(RR3)-1; %“中间值”得到的差值
if abs(chec3)
final_RR(k) = RR3; %收集找到的AF在Z=0处的根
final_SS(k) = MID(2,1); %收集找到的AB在Z=0处的根
final_IN(k) = aaa3; %收集找到的AF在Z=L处的值
break
elseif chec1*chec3>0 %否则进行替换
aaa1 = aaa3;
chec1 = chec3;
else
aaa2 = aaa3;
chec2 = chec3;
end
if abs(aaa1-aaa2)
aaa4 = (aaa1+aaa2)/2;
for n=1:N %传输矩阵
deltaneff_z=deltaneff;
lamdaD=1550*1e-9-L*neff*c+2*neff*c*(L*n/N-0.5*L/N);
sigma=2*pi*neff*(1/lamda(k)-1/lamdaD)+2*pi*deltaneff_z/lamda(k)+(4*pi*neff)*c*(2*(neff+deltaneff))*(-L/2+n*L/N)/lamdaD^2;
kac=pi*deltaneff_z/lamda(k);
RB=sqrt(kac^2-sigma^2)+eps;
F=F*[cosh(RB*L/N)-(sigma/RB)*sinh(RB*L/N)*1i,-(kac/RB)*sinh(RB*L/N)*1i;(kac/RB)*sinh(RB*L/N)*1i,cosh(RB*L/N)+(sigma/RB)*sinh(RB*L/N)*1i];
end %传输矩阵结束
MID = F*[aaa4;0];
RR4 = MID(1,1);
final_RR(k) = RR4; %收集根
final_SS(k) = MID(2,1); %收集根
final_IN(k) = aaa4; %收集根
break
end
nn = nn+1;
end %while
end %k
以上就是程序,是我程序写错了? 还是其他哪里不对?
多谢指教!:)