возможно матричный сюжет! - PullRequest
1 голос
/ 08 июля 2010

для неявного уравнения (назовите его "y") лямбды и бета-бара, которое отображается с помощью команды "ezplot", я знаю, что с помощью алгоритма поиска корней, такого как "метод деления пополам", я могу найти решения бета-бара для каждого приращения лямбда. но как построить такой алгоритм, чтобы получить строки правильно. (я думаю, что решения бета-бара должны лежать в матрице n * m) Вы бы в общих чертах показали методы построения такой проблемы? Благодарю. одна из моих причин - прерывание команды "ezplot" для моего уравнения. хорошо, вот моя картинка: альтернативный текст http://www.mojoimage.com/free-image-hosting-view-05.php?id=5039TE-beta-bar-L-n2-.png

или http://www.mojoimage.com/free-image-hosting-05/5039TE-beta-bar-L-n2-.png
Бесплатный хостинг изображений и мой код (короче):

h=ezplot('f1',[0.8,1.8,0.7,1.0]);

и в другом мфиле

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 не может найти корни; он говорит: «Значение функции должно быть действительным и конечным». В любом случае, возможно ли устранить разрыв и построить только реальные нули y? до сих пор для другой функции (а именно 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')

вы видите, я использую матрицу для сохранения данных для этого графика.

! [Альтернативный текст] [2] потому что здесь линии начинаются слева (от оси) до правой. но если первая строка (верхняя) начинается где-то сверху вниз (для первой цифры и функции f1), то я не знаю, как использовать матрицу. давайте улучшим этот метод.

[2]: http://www.mojoimage.com/free-image-hosting-05/2812untitled.png
Бесплатный хостинг изображений

1 Ответ

4 голосов
/ 09 июля 2010

Иногда EZPLOT будет отображать разрывы, потому что на самом деле разрывы или некоторая форма сложного поведения функции, возникающей там.Это можно увидеть, сгенерировав свой график альтернативным способом, используя функцию CONTOUR .

Сначала вы должны изменить свою функцию 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

И вы должны увидеть следующий график:

alt text

Обратите внимание, что теперь на графике есть дополнительные линии, которыене появляется при использовании EZPLOT , и эти строки очень зазубренные.Вы можете увеличить пересечение в левом верхнем углу и построить график, используя SURF , чтобы понять, что происходит:

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

alt text

Обратите внимание, что вдоль этих дополнительных линий происходит много периодических высокочастотных действий, поэтому на контурном графике они выглядят такими неровными.По этой же причине очень общая утилита, такая как EZPLOT , отображала разрыв строк в ней, поскольку она действительно не предназначена для обработки особых случаев сложных и плохо управляемых функций.

РЕДАКТИРОВАТЬ: (ответ на комментарии)

Эти дополнительные линии не могут быть истинными пересечениями с нулем, хотя это трудно понять из графика SURF ,На тех линиях может быть разрыв, когда функция отсекается до -Inf на одной стороне линии и Inf на другой стороне линии.При рендеринге поверхности или вычислении контура эти точки по обе стороны от линии могут быть ошибочно соединены, создавая ложное впечатление пересечения нуля вдоль линии.

Если вы хотите найти пересечение нуля с учетомзначение lambda, вы можете попробовать использовать функцию FZERO вместе с анонимной функцией , чтобы превратить вашу функцию двух переменных 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...