%考虑四个侧面 楔形体 改变内摩擦角fai clc;clear;close all; D=6; B=pi*D/4; gamma2=20; cc1=0.1*gamma2*D; beita=0; fai1=deg2rad(30); delta=0.8*fai1; alpha2=pi/4+fai1/2; L=D/tan(alpha2); Ka=(1-sin(fai1))./(1+sin(fai1)); theta2=pi/4+fai1/2; f_11=(Ka-(Ka.*sin(theta2)^2)./3+sin(theta2)^2./3)./(sin(theta2)^2+Ka.*cos(theta2)^2); f_12=f_11.*cos(theta2)^2+sin(theta2)^2./3-1; f_31=(1-Ka).*cos(fai1)./(2.*(sin(theta2)^2+Ka.*cos(theta2)^2)); f_32=cos(fai1)./(2.*(sin(theta2)^2+Ka.*cos(theta2)^2)); f_21=(Ka.*(1+sin(fai1))+(1-sin(fai1)))./(2.*(sin(theta2)^2+Ka.*cos(theta2)^2)); f_22=(cos(theta2)^2-sin(theta2)^2-sin(fai1))./(2.*(sin(theta2)^2+Ka.*cos(theta2)^2)); Kanw0=f_21./f_11; %大主应力侧压力系数(根据东北大学来的) C_value=(0.25:0.25:4)*D; C01_D=C_value/D; Cpie=B/Kanw0; Ve=pi*B*Cpie*L/4; Se=B*L; for ii=1:length(C_value) C=C_value(ii); C01=min(Ve./Se,C);%筒仓高度 figure; hold on; colors = [1 0 0; % 红 0 0 1; % 蓝 0 0.5 0; % 墨绿 1 0.5 0; % 橙 0.5 0 0.5]; % 紫 linestyle_options = {'--', ':', '-.', '-'}; Q1=0; P=2.*cc1.*sqrt(Ka).*(f_32-f_31.*f_12./f_11); E=f_31./f_11; J=2*(B+L)./(B*L); Q=(gamma2-J.*P)./(J.*E)+(Q1-(gamma2-J.*P)./(J.*E)).*exp(-J.*E.*C01);%筒仓传递下来的 theta=pi/2-1/2.*(asin(sin(delta)./sin(fai1)))+delta./2; Kanw1=3.*(cos(theta).^2+Ka.*sin(theta).^2)./(3-(1-Ka).*cos(theta).^2); Kanw2=3.*(cos(theta2).^2+Ka.*sin(theta2).^2)./(3-(1-Ka).*cos(theta2).^2); A1=Kanw1.*tan(delta);%tao_aw %tao_s A2=3*(1-Ka)*cos(fai1)/(2*(3-(1-Ka)*cos(theta)^2)); %seigema_s A3=3*(1-Ka)*cos(fai1)^2.*cot(alpha2)/(2*sin(fai1)*(3-(1-Ka)*cos(theta)^2)); %seigema_anw A4=Kanw1.*tan(beita); %tao_aw B1=cc1.*tan(delta).*(1+(1-Ka).*(((Kanw1*cos(theta).^2)/3)-sin(theta).^2))./tan(fai1);%tao_aw %tao_s B2=cc1*(1-Ka)*cos(fai1).^2./2*sin(fai1); B2=B2*(1+(1-Ka)*cos(theta)^2./3*(3-(1-Ka)*cos(theta)^2)); %seigema_s B3=cc1*(1-Ka)*cos(fai1).^2.*cot(alpha2)/(2*tan(fai1)*sin(fai1)); B3=B3*(1+(1-Ka)*cos(theta)^2./3*(3-(1-Ka)*cos(theta)^2))-cc1*cot(alpha2)./tan(fai1); %seigema_anw B4=cc1*(1-Ka)*tan(beita).*(((Kanw1*cos(theta).^2)/3)-sin(theta).^2)./tan(fai1); yita_1=A1+A2+A3+A4; yita_2=B1+B2+B3+B4; r=gamma2-2*cc1*sin(alpha2)./B;%对比时把后面的去掉 s=yita_1./(cot(alpha2)+tan(beita)); t=2*sin(alpha2)*Kanw2*tan(fai1)./B; kesi=yita_2./(cot(alpha2)+tan(beita)); tspan=[0 5.99]; f=@(z,q) [(r-kesi./(D-z))-((s-1)./(D-z)+t)*q] q0=Q; [z,q]=ode45(f, tspan, q0) seigama_anw=Kanw1*q+cc1*(1-Ka).*(Kanw1*cos(theta).^2/3-sin(theta).^2)./tan(fai1);%水平土压力 ZZ=z/D; line_style = linestyle_options{mod(ii-1,4)+1}; if ii == length(C_value) line_style = '-'; end plot(seigama_anw/(gamma2*D), z/D,... 'Color', colors(ii,:),... 'LineStyle', line_style,... 'LineWidth', 1.5); end hold on; grid off box off set(gca,'LineWidth',1.5,'FontSize',12,'FontName','Times New Roman'); xlabel('$\sigma_{\mathrm{h}} / \gamma H$', 'Interpreter', 'latex','FontSize', 14,'FontName', 'Times New Roman'); ylabel('$z/D$',... 'FontSize', 14,... 'FontName', 'Times New Roman',... 'Interpreter', 'latex'); axis ij; legend({ '$Q=0$', '$Q=0.25\gamma H$', '$Q=0.5\gamma H$', '$Q=0.75\gamma H$', '$Q=\gamma H$' },... 'Location', 'northeast',... 'Orientation', 'vertical',... 'FontSize', 12,... 'FontName', 'Times New Roman',... 'Interpreter', 'latex',... % 关键:启用LaTeX解释器 'Box', 'off'); 我要最后的图都在一张图上 怎么改
时间: 2025-06-22 08:32:13 浏览: 13
<think>好的,我现在需要帮助用户解决他们的问题,即如何将MATLAB代码生成的多个图形合并到一张图上。首先,我得仔细看看用户提供的代码,理解其结构,然后找出问题所在,并提出修改方案。
用户提到他们的代码生成了多个图形,但希望所有结果都显示在同一张图上。根据代码中的循环结构,每个循环迭代都会创建一个新的figure,导致每次循环生成一个新的图形窗口。因此,我需要找到如何将所有的绘图集中在同一个figure中。
首先,用户代码中的循环部分如下:
```matlab
for ii=1:length(C_value)
C=C_value(ii);
C01=min(Ve./Se,C);%筒仓高度
figure;
hold on;
...(绘图代码)
end
```
这里,每次循环都会执行`figure;`命令,这会导致每次迭代都创建一个新的图形窗口。因此,用户最终会得到多个独立的图形,每个对应不同的C_value值。
用户的目的是将所有曲线绘制到同一张图上。因此,需要将`figure;`移到循环之外,确保整个循环过程中只有一个图形窗口被创建和激活。这样,每次循环中的`plot`命令都会将曲线添加到同一个图中。
接下来,我需要检查代码中的其他部分是否会影响图形的合并。例如,hold on是否在正确的位置。当前的代码在循环内部调用hold on,但由于每次循环都创建新的figure,这实际上在每个新figure中启用hold on,但每个figure只有一个曲线。因此,正确的做法应该是在循环外部创建figure,并在循环外部启用hold on,然后在循环内部进行绘图。
修改后的代码结构应该是:
```matlab
figure;
hold on;
for ii=1:length(C_value)
...(计算部分)
plot(...);
end
...(其他图形设置)
```
这样,所有循环中的plot都会在同一个figure中添加曲线。
此外,用户代码中的legend设置可能存在问题。原代码中的legend条目是固定的,比如'$Q=0$', '$Q=0.25\gamma H$'等,但实际循环中C_value是从0.25到4,步长0.25,乘以D(D=6),所以可能需要检查图例是否与实际的C_value对应。但根据用户的legend设置,似乎他们希望用Q的不同值来表示不同的C/D比例,即C01_D = C_value/D,而C_value是(0.25:0.25:4)*D,所以C01_D的范围是0.25到4。但用户在图例中使用的是Q的表达式,可能这里的变量名存在混淆,需要确认是否正确。不过用户的问题主要集中在图形合并上,这部分可能暂时不需要处理,但需要注意图例是否正确反映不同的C_value情况。
此外,原代码中的legend是在循环外部设置的,但需要确保所有曲线都已经被绘制,并且图例条目与曲线数量一致。当前的legend有5个条目,而循环中C_value的长度是16(因为0.25:0.25:4共有16个元素),但用户提供的legend只有5个条目,这显然不匹配。这可能是一个错误,但用户的问题可能希望保留原有的图例,或者需要调整。但根据用户提供的legend内容,可能他们希望每个C_value对应不同的Q值,但代码中的Q计算可能与C相关,需要进一步确认。
不过,用户当前的问题只是如何将所有曲线绘制到同一张图上,所以可能图例的问题需要用户自行处理,或者需要进一步调整。但根据用户提供的代码中的legend部分,他们可能希望显示不同Q值对应的曲线,但实际上循环中的每个ii对应不同的C_value,而Q是根据C01计算的,可能每个C_value对应不同的Q值。但用户提供的legend只有5个条目,而循环次数是16次,这会导致图例和曲线数量不匹配,从而出现错误。这可能是用户代码中的一个bug,但用户并未提到这个问题,可能他们的实际数据或代码有所不同,或者示例代码被简化了。
回到主要问题,即如何将所有曲线放在同一张图上,解决方案是将figure和hold on移到循环外面。具体修改步骤:
1. 将`figure; hold on;`移到for循环之前,这样整个循环中的plot都会在同一个图中添加曲线。
2. 删除循环内部的`figure;`和`hold on;`,以避免创建新图形。
3. 确保图例和其他图形设置(如xlabel, ylabel, axis等)在循环之后执行,以正确应用到最后一张图上。
修改后的代码部分如下:
```matlab
D=6;
...(之前的变量定义)
figure; % 创建唯一的图形窗口
hold on; % 启用保持模式,所有plot都添加到同一图中
colors = [1 0 0; % 红
0 0 1; % 蓝
0 0.5 0; % 墨绿
1 0.5 0; % 橙
0.5 0 0.5]; % 紫
linestyle_options = {'--', ':', '-.', '-'};
for ii=1:length(C_value)
C=C_value(ii);
C01=min(Ve./Se,C);%筒仓高度
...(计算部分)
...(绘图部分,保持原有的plot命令)
plot(seigama_anw/(gamma2*D), z/D,...
'Color', colors(ii,:),...
'LineStyle', line_style,...
'LineWidth', 1.5);
end
...(后续的图形设置,如xlabel, ylabel, legend等)
```
但这里可能存在问题:colors数组只有5种颜色,而循环次数是16次(C_value长度是16),当ii超过5时,colors(ii,:)会索引越界。例如,当ii=6时,colors(6,:)不存在,因为colors只有5行。这将导致错误。同样,linestyle_options有4种样式,循环到第5次时,mod(ii-1,4)+1会回到1,所以每4次循环重复一次线型。
这可能与用户提供的legend中的5个条目不符,但原代码中C_value的长度可能被截断,或者用户提供的代码可能存在其他调整。例如,用户可能在示例代码中简化了C_value的生成,实际可能只有5个值。但根据用户提供的代码,C_value的生成是:
C_value=(0.25:0.25:4)*D;
这里的步长0.25,从0.25到4,共16个元素(0.25, 0.5, ..., 4.0)。乘以D=6后,C_value有16个值,每个都是不同的。因此,循环次数是16次,但colors只有5种颜色,这会导致问题。但用户可能在代码中实际运行时存在不同的设置,或者示例代码被简化了。不过,根据用户提供的legend条目有5个,可能他们希望只显示5种情况,所以可能C_value被错误地生成了16个,而实际上应该只有5个,比如从0.25到1,步长0.25,共4个,加上最后一个,或者用户可能希望用不同的方式处理。
这可能意味着用户的原始代码存在错误,需要进一步调整。例如,用户可能在循环中只处理前5个C_value,或者colors和linestyle需要更多的选项。但根据用户的问题描述,他们希望最后的图都在一张图上,而不管颜色和图例的问题,所以可能用户更关注如何合并图形,而颜色和图例的问题需要另外处理。
因此,在解决方案中,我需要指出将figure和hold on移到循环外,同时注意到颜色和线型的索引问题,可能需要调整colors和linestyle_options的长度以适应循环次数,或者用户可能希望使用不同的方式来分配颜色和线型。但根据用户提供的代码,他们可能希望每个C_value对应特定的颜色和线型,但目前的设置会导致颜色重复和线型循环。
例如,当ii超过5时,colors(ii,:)会报错,因为colors只有5行。因此,用户需要调整colors数组的长度,或者使用其他方法生成颜色,例如使用colormap。但用户的问题可能希望保持现有的颜色和线型分配方式,仅解决图形合并的问题,因此可能需要在回答中指出这一点,并建议调整颜色数组或使用循环索引的模运算来重复颜色。
不过,用户的问题可能更简单,他们可能希望将所有曲线绘制到同一张图上,而颜色和线型可以重复,或者他们可能在实际代码中有不同的设置。因此,在回答中,我需要专注于如何合并图形,并指出可能存在的颜色索引问题,建议用户根据实际情况调整颜色和线型的设置。
总结修改步骤:
1. 将`figure; hold on;`移到for循环之前,确保所有绘图在同一个图形中进行。
2. 删除循环内部的`figure;`和`hold on;`。
3. 确保图例和标签设置在循环之后执行。
另外,需要检查颜色和线型的分配是否会导致错误,例如当循环次数超过颜色数组的行数时,如何处理。如果用户希望为每个C_value分配不同的颜色和线型,可能需要扩展colors数组或使用其他方法生成颜色,例如使用`jet`或`hsv`等colormap函数。
例如,可以将colors改为生成16种不同的颜色:
colors = jet(length(C_value)); % 使用jet colormap生成与C_value数量相同的颜色
或者使用其他方式。此外,线型可能需要根据循环次数进行调整,例如:
linestyle_options = {'--', ':', '-.', '-', '-'}; % 添加更多线型或重复
但用户的原代码中linestyle_options有4种,使用mod(ii-1,4)+1来选择,所以每4次循环重复一次线型。这可能适用于较少的循环次数,但需要用户根据需求调整。
最后,用户的legend设置可能不正确,因为原代码中的legend条目是固定的5个,而循环次数是16次,这会导致图例条目数量不匹配。因此,可能需要动态生成图例标签,例如根据C_value的值生成对应的字符串,如:
legend_labels = arrayfun(@(x) sprintf('$Q=%.2f\\gamma H$', x/D), C_value, 'UniformOutput', false);
legend(legend_labels, 'Interpreter', 'latex');
但用户需要根据实际需求调整图例内容。
在回答中,我需要重点说明如何合并图形,并提及可能需要注意的颜色、线型和图例的问题,建议用户根据实际情况调整这些设置。</think>为了使所有曲线绘制在同一张图上,需要将`figure`创建和`hold on`命令移到循环外。以下是具体修改步骤:
```matlab
% 修改后的代码关键部分(完整修改见下方说明)
figure; % 创建唯一图形窗口
hold on; % 启用图形保持
colors = [1 0 0; 0 0 1; 0 0.5 0; 1 0.5 0; 0.5 0 0.5]; % 颜色定义
linestyle_options = {'--', ':', '-.', '-'};
for ii=1:length(C_value)
% 删除循环内的figure和hold on
% 计算部分保持不变...
% 绘图部分
line_style = linestyle_options{mod(ii-1,4)+1};
if ii == length(C_value)
line_style = '-';
end
plot(seigama_anw/(gamma2*D), z/D,...
'Color', colors(mod(ii-1,5)+1,:),... % 颜色循环使用
'LineStyle', line_style,...
'LineWidth', 1.5);
end
% 图形修饰部分保持不变...
```
### 修改说明:
1. **图形初始化外移**
将`figure; hold on;`移到`for`循环之前,确保所有曲线绘制到同一坐标系。
2. **颜色循环机制**
原代码颜色数组只有5种颜色,通过`mod(ii-1,5)+1`实现颜色循环(当ii超过5时会重复颜色)。
3. **线型分配逻辑保留**
保持原有的线型循环逻辑,每4种线型重复一次。
4. **图例动态生成(可选)**
若需正确匹配图例,建议改用动态标签:
```matlab
legend_labels = arrayfun(@(x) sprintf('C/D=%.2f',x/D), C01_D, 'UniformOutput',false);
legend(legend_labels, 'Interpreter','latex');
```
### 完整修改后的代码结构:
```matlab
clc; clear; close all;
D=6;
% ...(中间变量定义保持不变)...
figure;
hold on;
colors = [1 0 0; 0 0 1; 0 0.5 0; 1 0.5 0; 0.5 0 0.5];
linestyle_options = {'--', ':', '-.', '-'};
for ii=1:length(C_value)
C=C_value(ii);
% ...(中间计算部分保持不变)...
% 绘图部分
line_style = linestyle_options{mod(ii-1,4)+1};
if ii == length(C_value)
line_style = '-';
end
plot(seigama_anw/(gamma2*D), z/D,...
'Color', colors(mod(ii-1,5)+1,:),...
'LineStyle', line_style,...
'LineWidth', 1.5);
end
% 图形修饰
set(gca,'LineWidth',1.5,'FontSize',12,'FontName','Times New Roman');
xlabel('$\sigma_{\mathrm{h}} / \gamma H$','Interpreter','latex');
ylabel('$z/D$','Interpreter','latex');
axis ij;
% 动态生成图例(示例)
legend_labels = arrayfun(@(x) sprintf('$C/D=%.2f$',x), C01_D, 'UniformOutput',false);
legend(legend_labels,'Interpreter','latex','Box','off');
```
### 效果:
- 所有曲线将叠加在同一张图上
- 颜色和线型自动循环使用预设值
- 图例动态匹配实际参数值
### 注意事项:
- 如果颜色种类不足,可通过`colormap(jet(16))`生成更多颜色
- 线型若需更多变化,可扩展`linestyle_options`数组
- 图例标签建议根据实际物理意义定制(示例中使用了`C/D`比值)
阅读全文
相关推荐












