Иногда 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
И вы должны увидеть следующий график:
Обратите внимание, что теперь на графике есть дополнительные линии, которыене появляется при использовании 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
Обратите внимание, что вдоль этих дополнительных линий происходит много периодических высокочастотных действий, поэтому на контурном графике они выглядят такими неровными.По этой же причине очень общая утилита, такая как 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