MATLAB:带颜色的 z 轴的二维图
MATLAB: 2-D plot with z-axis given in color
我和我的朋友们一直在努力在 MATLAB 中生成二维绘图
$\eta_1$ 和 $\eta_2$ 都在 $0:0.01:1$ 和由颜色给出的 z 轴上变化。
我们有一个包含 8 个微分方程的系统,其中 HIVinf 代表超过 1 年的人群中新感染 HIV 的总数(HIVinf 是通过对 $\eta_1、\[=35= 的函数进行积分得到的]$).
我们正在循环 $\eta_1$ 和 $\eta_2$(两个 'for' 循环),在 'for' 循环中使用 ode45 求解器。
根据我们之前的数值结果,我们应该会在二维图中看到很多颜色变化。沿着图的边缘应该有黑暗模式(高浓度的 HIV 感染),沿着对角线(低浓度)应该有亮度。
然而,下面的代码片段并没有产生我们想要的结果(我附上了下图)。
[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
好吧,我真的不太了解情节应该是什么样子,但是你的 eta_11 和 eta_22 是仅在内部循环中索引的变量。这意味着当 n=1, m=1,2,3,...,alpha 时,您的 eta_11/eta_22 将是一个向量,其元素 1,2,3,...,alpha 将被每个 n 覆盖.由于您的 meshgrid 在循环之外,这可能是一个问题。通常,如果您正在绘制两个变量的函数,并且您在 2 个嵌套循环中说了变量,您只需忽略 meshgrid。像这样
选项 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)
我和我的朋友们一直在努力在 MATLAB 中生成二维绘图 $\eta_1$ 和 $\eta_2$ 都在 $0:0.01:1$ 和由颜色给出的 z 轴上变化。
我们有一个包含 8 个微分方程的系统,其中 HIVinf 代表超过 1 年的人群中新感染 HIV 的总数(HIVinf 是通过对 $\eta_1、\[=35= 的函数进行积分得到的]$).
我们正在循环 $\eta_1$ 和 $\eta_2$(两个 'for' 循环),在 'for' 循环中使用 ode45 求解器。
根据我们之前的数值结果,我们应该会在二维图中看到很多颜色变化。沿着图的边缘应该有黑暗模式(高浓度的 HIV 感染),沿着对角线(低浓度)应该有亮度。
然而,下面的代码片段并没有产生我们想要的结果(我附上了下图)。
[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
好吧,我真的不太了解情节应该是什么样子,但是你的 eta_11 和 eta_22 是仅在内部循环中索引的变量。这意味着当 n=1, m=1,2,3,...,alpha 时,您的 eta_11/eta_22 将是一个向量,其元素 1,2,3,...,alpha 将被每个 n 覆盖.由于您的 meshgrid 在循环之外,这可能是一个问题。通常,如果您正在绘制两个变量的函数,并且您在 2 个嵌套循环中说了变量,您只需忽略 meshgrid。像这样
选项 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)