2015-11-29 2 views
1

Я хочу создать 3D-график последней доли травы, покрытой Землей (= через 2 миллиарда лет) (= A) в зависимости от меняющейся смертности травы (= D) и скорость роста травы (= G).Создание 3D-графика в Matlab

Окончательное значение А (в 2 миллиарда лет от сейчас) может быть вычислена с помощью цикла со следующим уравнением: discritised

A (T + DT) = А (Т) * ((1- а (т)) * GD) * дт + а (т)

%Define variables and arrays 

D=0.1;        %constant value 
G=0.4;        %constant value 
A=0.001;       %initial value of A at t=0 
t=0; 
dt=10E6; 
startloop=1;      %define number of iterations 
endloop=200;     

timevector=zeros(1,endloop);  %create vector with 0 
grassvector=zeros(1,endloop); 

%Define the loop 

for t=startloop:endloop 
    A=A.*((((1-A).*G)-D)) + A; 
    grassvector(t)=A; 
    timevector(t)=t*dt; 
end 

Теперь я застрял на том, как создать 3D сюжет этой конечной величины а в зависимости от того или иного G и D. Я получил это, но после нескольких испытаний он продолжает давать ошибки:

%(1) Create array of values for G and D varying between 0 and 1 

A=0.001; 
G=[0.005:0.005:1];   %Vary from 0.005 to 1 in steps of 0.005 
D=[0.005:0.005:1];   %Vary from 0.005 to 1 in steps of 0.005 

%(2) Meshgrid both variables = all possible combinations in a matrix 

[Ggrid,Dgrid]=meshgrid(G,D); 

%(3) Calculate the final grass fraction with varying G and D 

D=0.1; 
G=0.4; 
A=0.001; 
t=0; 
dt=10E6; 
startloop=1;      %define number of iterations 
endloop=200;     

timevector=zeros(1,endloop);  %create vector with 0 
grassvector=zeros(1,endloop); 

%Define the loop 

for t=startloop:endloop 
    A=A.*((((1-A).*Ggrid)-Dgrid)) + A; 
    grassvector(t)=A; 
    timevector(t)=t*dt; 
end 

%(4) mesh together with D and G 
...?? 

Может ли кто-нибудь помочь? Благодаря!

+0

Вы код trhows ошибку, потому что grassvector не тот же размер, как A. Первый, аккуратный код, а затем спросить о заговоре! –

ответ

5

Ваш код является неправильным, так как grassvector (t) = A; не могут быть выполнены, поскольку размеры не согласованы. Тем не менее, я думаю, что вы можете сделать:

grassvector=zeros([size(Ggrid),endloop]); 

и в петле:

grassvector(:,:,t)=A; 

Кроме того, в то время как полностью unnecesary вычислительно, вы можете инициализировать A к A=0.001*ones(size(Dgrid)), как это имеет смысл логически.

В любом случае: это, как вы можете построить его в конце концов:

surf(Ggrid,Dgrid,A,'LineStyle','none'); 
xlabel('growth rate ') 
ylabel('death rate ') 
zlabel('grass') 
colorbar 

дает:

enter image description here

Но, как я был на самом деле заинтересован в ваших исследованиях, я решил сделать несколько участков, чтобы увидеть, как быстро будет расти трава и прочее. Вот хороший код построения. Здесь вы можете изменить разные вещи, чтобы изменить внешний вид. Я использую пользовательские цветовые карты, поэтому, если он не работает, удалите строку colormap(viridis()). Если вам нравится цветовая палитра, visit this.

fh=figure(); 
filename='grass.gif'; 
for t=startloop:endloop 
    clf 
    hold on 
    surf(Ggrid,Dgrid,grassvector(:,:,t),'LineStyle','none'); 
    [c,h]=contour3(Ggrid,Dgrid,grassvector(:,:,t)+0.05,[0:0.1:1],'LineColor',[153,0,18]/255,'LineWidth',2); 
    clabel(c,h); 
    xlabel('growth rate ') 
    ylabel('death rate ') 
    zlabel('grass') 
    title(['Years passed: ' num2str(t*dt/1000000) ' million']) 
    colormap(viridis()) 
    axis([0 1 0 1 0 1]) 
grid on 
    view(-120,40); 

    frame = getframe(fh); 
    im = frame2im(frame); 
    [imind,cm] = rgb2ind(im,256); 
    if t == 1; 
     imwrite(imind,cm,filename,'gif', 'Loopcount',inf); 
    else 
     imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',0.1); 
    end 
end 

Результаты:

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