2015-12-02 2 views
2

Я уже знал, как построить трехмерную неявную функцию f (x, y, z) = 0 с помощью функции isosurface. Теперь мне интересно, как рисовать контуры. Как это:Контуры неявной функции f (x, y, z) = 0 в MATLAB

f(x,y,z) = sin((x.*z-0.5).^2+2*x.*y.^2-0.1*z) - z.*exp((x-0.5-exp(z-y)).^2+y.^2-0.2*z+3) 

enter image description here

+2

Что вы имеете в виду, говоря "контуры"? 2D-график через x и y для некоторого фиксированного значения z? – Anton

+0

Технически «изоповерхность» представляет собой контур функции f (x, y, z). –

+0

@ Антон, Андер Бигури: Да, извините за двусмысленность, я хочу контуры z, а не f. На самом деле у меня есть подход для рисования контуров z. Я могу просто рассматривать z как параметр и нарисовать неявную функцию с одной независимой переменной f (x, y) = 0 с помощью 'ezplot' для каждого значения z. Но мне интересно, есть ли более элегантные способы понять это. – Highman

ответ

2

Вы могли бы численно работать над Z и искать при изменении знака, создавая матрицу, которая содержит значение Z, это не элегантно, но он работает.

%Create function to evaluate 
eq=eval(['@(x,y,z)',vectorize('sin((x*z-0.5)^2+2*x*y^2-0.1*z) - z*exp((x-0.5-exp(z-y))^2+y^2-0.2*z+3)'),';']) 

%Create grid of x and y values 
[x,y]=meshgrid(0:0.01:15,-2:0.01:2); 

%Create dummy to hold the zero transitions 
foo=zeros(size(x)); 

%Run over Z and hold the values where the sign changes 
for i=0:0.001:0.04 
    aux=eq(x,y,i)>0; 
    foo(aux)=i; 
end 

%Contour those values 
contour(foo) 

Edit: я нашел немного более элегантное решение, используя функцию scatteredInterpolant

%Create function to evaluate 
eq=eval(['@(x,y,z)',vectorize('sin((x*z-0.5)^2+2*x*y^2-0.1*z) - z*exp((x-0.5-exp(z-y))^2+y^2-0.2*z+3)'),';']); 

%Create grid to evaluate volume 
[xm,ym,zm]=meshgrid(0:0.1:15,-2:0.1:2,-0.01:0.001:0.04); 

$Find the isosurface 
s=isosurface(xm,ym,zm,eq(xm,ym,zm), 0); 

$Use the vertices of the surface to create a interpolated function 
F=scatteredInterpolant(s.vertices(:,1),s.vertices(:,2),s.vertices(:,3)); 

%Create a grid to plot 
[x,y]=meshgrid(0:0.1:15,-2:0.1:2); 

%Contour this function 
contour(x,y, F(x,y),30) 
+0

Второе решение кажется более приятным. Удобно, когда вы уже использовали 'isosurface', чтобы определить его форму. Спасибо. – Highman

Смежные вопросы