MATLAB: 2D-график с осью Z в цвете

Мои друзья и я изо всех сил пытались создать двумерный график в MATLAB с $\eta_1$ и $\eta_2$, оба из которых варьируются в $0:0.01:1$, а ось z задана цветом.

У нас есть система из 8 дифференциальных уравнений, где ВИЧинф представляет общее количество новых случаев ВИЧ-инфекции в популяции за 1 год (ВИЧинф получен путем интегрирования функции $\eta_1, \eta_2$).

Мы перебираем $\eta_1$ и $\eta_2$ (два цикла for) с помощью решателя ode45 в циклах for.

Основываясь на наших предыдущих численных результатах, мы должны получить много цветовых вариаций на 2D-графике. По краям участка должны быть темные узоры (высокая концентрация ВИЧ-инфекций), а по диагоналям — светлые (низкие концентрации).

Однако следующий фрагмент не дает того, что нам нужно (рисунок ниже).

[X,Y] = meshgrid(eta_11,eta_22);
figure;
pcolor(X,Y,AA); 
shading interp;

введите здесь описание изображения

Я приложил код ниже, как можно короче. Функция ydot работает нормально (требуется запустить ode45).

Мы будем очень признательны, если вы поможете нам исправить фрагмент кода.


function All()

global Lambda mu mu_A mu_T beta tau eta_1 eta_2 lambda_T rho_1 rho_2 gamma
alpha = 20;
TIME = 365;
eta_11 = zeros(1,alpha);
eta_22 = zeros(1,alpha); 
AA = zeros(1,alpha);
BB = zeros(1,alpha);
CC = zeros(1,alpha);

for n = 1:1:alpha
    for m = 1:1:alpha 
    Lambda = 531062; 
    mu = 1/25550;
    mu_A = 1/1460;
    mu_T = 1/1825;
    beta = 187/365000; 
    tau = 4/365;  
    lambda_T = 1/10;
    rho_1 = 1/180;
    rho_2 = 1/90;
    gamma = 1/1000;

    eta_1 = (n-1)./(alpha-1);
    eta_11(m) = (m-1)./(alpha-1);

    eta_2 = (m-1)./(alpha-1);
    eta_22(m) = (m-1)./(alpha-1);

    y0 = [191564208, 131533276, 2405629, 1805024, 1000000, 1000000, 500000, 500000];

    [t,y] = ode45('SimplifiedEqns',[0:1:TIME],y0);

    N = y(:,1)+y(:,2)+y(:,3)+y(:,4)+y(:,5)+y(;,6)+y(:,7)+y(:,8);

    HIVinf1=[0:1:TIME];
    HIVinf2=[beta.*(S+T).*(C1+C2)./N];
    HIVinf=trapz(HIVinf1,HIVinf2);
    AA(n,m) = HIVinf;
    end    
end

[X,Y] = meshgrid(eta_11,eta_22);
figure;
pcolor(X,Y,AA); 
shading interp;

function ydot = SimplifiedEqns(t,y)

global Lambda mu mu_A mu_T beta tau eta_1 eta_2 lambda_T rho_1 rho_2 gamma

S = y(1);
T = y(2);
H = y(3); 
C = y(4);
C1 = y(5); 
C2 = y(6);
CM1 = y(7); 
CM2 = y(8);

N = S + T + H + C + C1 + C2 + CM1 + CM2;
ydot = zeros(8,1);

ydot(1)=Lambda-mu.*S-beta.*(H+C+C1+C2).*(S./N)-tau.*(T+C).*(S./N);
ydot(2)=tau.*(T+C).*(S./N)-beta.*(H+C+C1+C2).*(T./N)-(mu+mu_T).*T;
ydot(3)=beta.*(H+C+C1+C2).*(S./N)-tau.*(T+C).*(H./N)-(mu+mu_A).*H;
ydot(4)=beta.*(H+C+C1+C2).*(T./N)+tau.*(T+C).*(H./N)-   (mu+mu_A+mu_T+lambda_T).*C;
ydot(5)=lambda_T.*C-(mu+mu_A+rho_1+eta_1).*C1;
ydot(6)=rho_1.*C1-(mu+mu_A+rho_2+eta_2).*C2;
ydot(7)=eta_1.*C1-(mu+rho_1+gamma).*CM1;
ydot(8)=eta_2.*C2-(mu+rho_2+gamma.*(rho_1)./(rho_1+rho_2)).*CM2+(rho_1).*CM1;
end
end

person arabhi manachra    schedule 08.04.2015    source источник


Ответы (1)


Хорошо, я мало знаю о том, как должен выглядеть график, но ваши eta_11 и eta_22 — это переменные, которые индексируются только во внутреннем цикле. Это означает, что когда n=1, m=1,2,3,...,альфа, ваш eta_11/eta_22 будет вектором, элементы которого 1,2,3,...,альфа будут перезаписаны для каждого n. Поскольку ваша сетка находится вне цикла, это может быть проблемой. Обычно, если вы рисуете функции двух переменных и у вас есть указанные переменные в двух вложенных циклах, вы просто игнорируете сетку. Нравится

Опция 1:

x=[0:0.01:1];
[x1,x2]=meshgrid(x,x);
y=x1+cos(x2);
contour(x,x,y,30);

Вариант 2

x=[0:0.01:1];
for i=1:101 %length(x)
    for j=1:101
        y(i,j)=x1(i)+cos(x2(j)); % It is important to index y with both
                                 % loop variables
    end
end
contour(x,x,y,30)     
person Peter Hristov    schedule 08.04.2015