Matlab 也许是矩阵图!
对于使用“ezplot”命令绘制的lambda和beta bar的隐式方程(名称为“y”),我知道,通过像“二分法”这样的寻根算法,我可以为lambda的每个增量找到beta bar的解。但是如何建立这样一个算法来正确地获取直线呢。 (我认为beta bar的解决方案应该位于n*m矩阵中) 你能概括地说明绘制此类问题的方法吗?谢谢 我的原因之一是我的等式的“ezplot”命令不连续。 好的,这是我的照片: 或Matlab 也许是矩阵图!,matlab,Matlab,对于使用“ezplot”命令绘制的lambda和beta bar的隐式方程(名称为“y”),我知道,通过像“二分法”这样的寻根算法,我可以为lambda的每个增量找到beta bar的解。但是如何建立这样一个算法来正确地获取直线呢。 (我认为beta bar的解决方案应该位于n*m矩阵中) 你能概括地说明绘制此类问题的方法吗?谢谢 我的原因之一是我的等式的“ezplot”命令不连续。 好的,这是我的照片: 或 和我的代码(简而言之): 在另一个m文件中 function y=f1(lambd
和我的代码(简而言之): 在另一个m文件中
function y=f1(lambda,betab)
n1=1.5; n2=1; z0=120*pi;
d1=1; d2=1; a=1;
k0=2*pi/lambda;
u= sqrt(n1^2-betab^2);
wb= sqrt(n2^2-betab^2);
uu=k0*u*d1;
wwb=k0*wb*d2 ;
z1=z0/u; z1_b=z1/z0;
a0_b=tan(wwb)/u+tan(uu)/wb;
b0_b=(1/u^2-1/wb^2)*tan(uu)*tan(wwb);
c0_b=1/(u*wb)*(tan(uu)/u+tan(wwb)/wb);
uu0= k0*u*a; m=0;
y=(a0_b*z1_b^2+c0_b)+(a0_b*z1_b^2-c0_b)*...
cos(2*uu0+m*pi)+b0_b*z1_b*sin(2*uu0+m*pi);
end
fzero找不到根;它说“函数值必须是实的和有限的”。
不管怎样,是否有可能消除不连续性,只绘制不连续性的实零点?
迄今为止,对于另一个功能(即fTE),即:
function y=fTE(lambda,betab,s)
m=s;
n1=1.5; n2=1;
d1=1; d2=1; a=1;
z0=120*pi;
k0=2*pi/lambda;
u = sqrt(n1^2-betab^2);
w = sqrt(betab^2-n2^2);
U = k0*u*d1;
W = k0*w*d2 ;
z1 = z0/u; z1_b = z1/z0;
a0_b = tanh(W)/u-tan(U)/w;
b0_b = (1/u^2+1/w^2)*tan(U)*tanh(W);
c0_b = -(tan(U)/u+tanh(W)/w)/(u*w);
U0 = k0*u*a;
y = (a0_b*z1_b^2+c0_b)+(a0_b*z1_b^2-c0_b)*cos(2*U0+m*pi)...
+ b0_b*z1_b*sin(2*U0+m*pi);
end
我用这些代码画出了“y”的实零:
s=0; % s=0 for even modes and s=1 for odd modes.
lmin=0.8; lmax=1.8;
bmin=1; bmax=1.5;
lam=linspace(lmin,lmax,1000);
for n=1:length(lam)
increment=0.001; tolerence=1e-14; xstart=bmax-increment;
x=xstart;
dx=increment;
m=0;
while x > bmin
while dx/x >= tolerence
if fTE(lam(n),x,s)*fTE(lam(n),x-dx,s)<0
dx=dx/2;
else
x=x-dx;
end
end
if abs(real(fTE(lam(n),x,s))) < 1e-6 %because of discontinuity some answers are not correct.%
m=m+1;
r(n,m)=x;
end
dx=increment;
x=0.99*x;
end
end
figure
hold on,plot(lam,r(:,1),'k'),plot(lam,r(:,2),'c'),plot(lam,r(:,3),'m'),
xlim([lmin,lmax]);ylim([1,1.5]),
xlabel('\lambda(\mum)'),ylabel('\beta-bar')
s=0;%s=0表示偶数模式,s=1表示奇数模式。
lmin=0.8;lmax=1.8;
bmin=1;bmax=1.5;
lam=linspace(lmin,lmax,1000);
对于n=1:长度(lam)
增量=0.001;公差=1e-14;xstart=bmax增量;
x=xstart;
dx=增量;
m=0;
而x>bmin
而dx/x>=公差
如果fTE(lam(n),x,s)*fTE(lam(n),x-dx,s)有时会显示不连续,因为确实存在不连续或函数的某种形式的复杂行为。通过使用函数以另一种方式生成绘图,可以看到这一点
您应该首先修改f1
函数,将(*
、/
和^
)替换为它们的元素等价物(*
、/
和^
),以便f1
可以接受lambda
和betab
的矩阵输入。然后,运行以下代码:
lambda = linspace(0.8,1.8,500); %# Create a vector of 500 lambda values
betab = linspace(0.7,1,500); %# Create a vector of 500 betab values
[L,B] = meshgrid(lambda,betab); %# Create 2-D grids of values
y = f1(L,B); %# Evaluate f1 at every point in the grid
[c,h] = contour(L,B,y,[0 0]); %# Plot contour lines for the value 0
set(h,'Color','b'); %# Change the lines to blue
xlabel('\lambda'); %# Add an x label
ylabel('$\overline{\beta}$','Interpreter','latex'); %# Add a y label
title('y = 0'); %# Add a title
你应该看到下面的图:
请注意,现在绘图中还有一些在使用时未显示的线,这些线非常参差不齐。您可以放大左上角的交叉点,并使用绘制图来了解发生了什么:
lambda = linspace(0.85,0.95,100); %# Some new lambda values
betab = linspace(0.95,1,100); %# Some new betab values
[L,B] = meshgrid(lambda,betab); %# Create 2-D grids of values
y = f1(L,B); %# Evaluate f1 at every point in the grid
surf(L,B,y); %# Make a 3-D surface plot of y
axis([0.85 0.95 0.95 1 -5000 5000]); %# Change the axes limits
xlabel('\lambda'); %# Add an x label
ylabel('$\overline{\beta}$','Interpreter','latex'); %# Add a y label
zlabel('y'); %# Add a z label
请注意,沿着这些附加线有许多高频周期性活动,这就是它们在等高线图中看起来如此参差不齐的原因。这也是为什么像这样一个非常通用的实用程序在那里显示了一个中断,因为它实际上并不是设计用来处理复杂和性能差的函数的特定情况
编辑:(回复评论)
这些额外的线可能不是真正的零交叉点,尽管很难从图中分辨出来。这些行可能存在不连续性,其中函数在行的一侧发射到-Inf
,在行的另一侧发射到Inf
。渲染曲面或计算轮廓时,直线两侧的这些点可能会错误连接,从而使直线出现过零的错误外观
如果要在给定值为lambda
的情况下找到零交叉点,可以尝试将函数与一起使用,将两个变量的函数f1
转换为一个变量的函数fcn
:
lambda_zero = 1.5; %# The value of lambda at the zero crossing
fcn = @(x) f1(lambda_zero,x); %# A function of one variable (lambda is fixed)
betab_zero = fzero(fcn,0.94); %# Find the value of betab at the zero crossing,
%# using 0.94 as an initial guess
有时会显示不连续,因为确实存在不连续或函数的某种形式的复杂行为。通过使用函数以另一种方式生成绘图,可以看到这一点
您应该首先修改f1
函数,将(*
、/
和^
)替换为它们的元素等价物(*
、/
和^
),以便f1
可以接受lambda
和betab
的矩阵输入。然后,运行以下代码:
lambda = linspace(0.8,1.8,500); %# Create a vector of 500 lambda values
betab = linspace(0.7,1,500); %# Create a vector of 500 betab values
[L,B] = meshgrid(lambda,betab); %# Create 2-D grids of values
y = f1(L,B); %# Evaluate f1 at every point in the grid
[c,h] = contour(L,B,y,[0 0]); %# Plot contour lines for the value 0
set(h,'Color','b'); %# Change the lines to blue
xlabel('\lambda'); %# Add an x label
ylabel('$\overline{\beta}$','Interpreter','latex'); %# Add a y label
title('y = 0'); %# Add a title
你应该看到下面的图:
请注意,现在绘图中还有一些在使用时未显示的线,这些线非常参差不齐。您可以放大左上角的交叉点,并使用绘制图来了解发生了什么:
lambda = linspace(0.85,0.95,100); %# Some new lambda values
betab = linspace(0.95,1,100); %# Some new betab values
[L,B] = meshgrid(lambda,betab); %# Create 2-D grids of values
y = f1(L,B); %# Evaluate f1 at every point in the grid
surf(L,B,y); %# Make a 3-D surface plot of y
axis([0.85 0.95 0.95 1 -5000 5000]); %# Change the axes limits
xlabel('\lambda'); %# Add an x label
ylabel('$\overline{\beta}$','Interpreter','latex'); %# Add a y label
zlabel('y'); %# Add a z label
请注意,沿着这些附加线有许多高频周期性活动,这就是它们在等高线图中看起来如此参差不齐的原因。这也是为什么像这样一个非常通用的实用程序在那里显示了一个中断,因为它实际上并不是设计用来处理复杂和性能差的函数的特定情况
编辑:(回复评论)
这些额外的线可能不是真正的零交叉点,尽管很难从图中分辨出来。这些行可能存在不连续性,其中函数在行的一侧发射到-Inf
,在行的另一侧发射到Inf
。渲染曲面或计算轮廓时,直线两侧的这些点可能会错误连接,从而使直线出现过零的错误外观
如果要在给定值为lambda
的情况下找到零交叉点,可以尝试将函数与一起使用,将两个变量的函数f1
转换为一个变量的函数fcn
:
lambda_zero = 1.5; %# The value of lambda at the zero crossing
fcn = @(x) f1(lambda_zero,x); %# A function of one variable (lambda is fixed)
betab_zero = fzero(fcn,0.94); %# Find the value of betab at the zero crossing,
%# using 0.94 as an initial guess
使用“图像”按钮(工具栏中的第六个),并发布一些代码。您希望我们如何帮助您编写Matlab,而不向我们展示您已经编写的内容?查看您正在使用的公式将非常有帮助。使用“图像”按钮(工具栏中的第六个按钮)。并发布一些代码。您希望我们如何帮助您编写Matlab而不向我们展示您已经编写的内容?查看您正在使用的方程式将非常有帮助。谢谢。但是,如何为给定的λ(比如λ=1.5)提取βbar的值呢?还有别的。为什么当我使用根查找方法查找一系列lambda的测试条时,额外的行不会显示出来?@Alireza:我更新了我的答案以解决您的评论。充满希望的