%考虑四个侧面 楔形体 改变内摩擦角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:1.5)*D; C01_D=C_value/D; Cpie=B/Kanw0; Ve=pi*B*Cpie*L/4; Se=B*L; figure; hold on; colors = [1 0 0; % 红 0 0 1; % 蓝 0 0.5 0; % 墨绿 1 0.5 0; % 橙 0.5 0 0.5]; % 紫 linestyles = {'--', ':', '-.', '-'}; for ii=1:length(C_value) C=C_value(ii); C01=min(Ve./Se,C);%筒仓高度 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; if ii == length(C_value) % 最后一条保持实线 plot(seigama_anw/(gamma2*D), ZZ, 'Color', colors(ii,:),... 'LineWidth',1.5, 'LineStyle','-'); else % 其他情况使用不同虚线 plot(seigama_anw/(gamma2*D), ZZ, 'Color', colors(ii,:),... 'LineWidth',1.5, 'LineStyle',linestyles{ii}); end 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('$C01_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'); 把图例换成关于每一个C01_D的
时间: 2025-06-22 22:34:12 浏览: 11
<think>嗯,用户提供的代码是关于楔形体的侧压力分析,特别是改变内摩擦角φ的影响。用户希望将图例中的内容替换为关于C01_D的不同值,而不是原来的Q值。我需要先理解代码的结构和变量之间的关系。
首先,代码中C_value被定义为(0.25:0.25:1.5)*D,也就是从0.25D到1.5D,间隔0.25D。然后C01_D = C_value/D,所以C01_D的值应该是0.25, 0.5, 0.75, 1.0, 1.25, 1.5。但在循环中,循环次数是length(C_value),也就是6次?但用户提供的代码中C_value是1x6的数组,所以循环应该是6次。但原始图例里只有5个条目,这可能是因为代码中可能存在错误,比如颜色和线型的分配可能不够,导致最后一个用实线,其他用不同的虚线。
接下来,用户希望图例显示的是C01_D的值,即0.25, 0.5, 0.75, 1.0, 1.25, 1.5。但原代码中的legend部分写的是Q的不同表达式,显然需要替换。但原legend有5个条目,而C_value可能有6个值,这里可能存在不一致。需要检查代码中的C_value定义是否正确,以及循环次数是否匹配。
在代码中,C_value被定义为(0.25:0.25:1.5)*D,即步长0.25,从0.25到1.5,总共有(1.5-0.25)/0.25 +1 =6个元素,所以应该是6个值。但原legend只有5个条目,这可能是因为用户代码中的错误,或者可能示例代码中的C_value被截断了?
在用户提供的代码中,legend部分有5个条目,而循环次数是length(C_value),假设C_value有5个元素。但根据代码中的定义,C_value是(0.25:0.25:1.5)*D,这会产生6个元素,因为0.25:0.25:1.5是0.25, 0.5, 0.75, 1.0, 1.25, 1.5,共6个。但示例中的legend条目是5个,这可能存在矛盾,需要确认。
但用户的问题是将图例替换为关于C01_D的,也就是每个C_value对应的C01_D。因此,正确的做法是修改legend的内容,用C01_D的各个值来表示,使用LaTeX格式,如'$C_{01}/D=0.25$'等。
因此,在legend部分,应该将原来的Q相关的描述改为C01/D的值。原代码中的循环变量ii从1到length(C_value),即每个C_value对应一个图例条目。因此,需要生成对应的字符串,将每个C01_D的值显示出来。例如,对于C_value中的每个元素,C01_D = C_value(ii)/D,即0.25, 0.5, ..., 1.5。
所以,在legend的cell数组中,应该生成类似'$C_{01}/D=0.25$', '$C_{01}/D=0.5$'等的条目,共6个。但原代码中的legend只有5个,这可能是因为用户代码中存在错误,或者示例中的C_value被错误地定义为5个元素?
需要检查用户提供的代码中的C_value定义。在代码中,C_value = (0.25:0.25:1.5)*D,这确实生成6个元素,因为0.25到1.5的步长0.25,共6个数。但用户提供的legend部分有5个条目,可能示例代码有误,或者用户希望截断到某个值?
另外,在代码的图例部分,原来的legend条目是Q=0, 0.25γH等,而用户希望替换为C01/D的不同值。所以,正确的做法是根据循环中的每个C_value,生成对应的C01/D的值,作为图例。
因此,需要修改legend的内容,用C01_D的值,即0.25, 0.5, 0.75, 1.0, 1.25, 1.5。但原代码中的颜色数组colors有5行,可能只支持5种颜色,这会导致当C_value有6个值时,颜色不足,出现错误。因此,可能用户提供的代码中的colors数组有误,应该对应6个颜色,或者C_value实际上只有5个元素?
检查用户提供的代码中的C_value定义:
C_value=(0.25:0.25:1.5)*D;
这确实是6个元素。但colors数组是5行,linestyles有4种,循环中当ii到5时,linestyles{5}不存在,因为linestyles只有4个元素(--, :, -., -)。所以当ii=5时,linestyles{5}会报错。这可能是代码中的错误,导致实际运行时可能只循环了前4个或5个元素?
或者,可能用户提供的代码在示例中有误,实际C_value可能是(0.25:0.25:1.25)*D,即5个元素?
这种情况下,需要用户确认。但根据用户的问题描述,他们希望将图例替换为关于C01_D的,所以应该根据C_value的实际数量来生成对应的图例条目。
假设用户代码中的C_value确实是6个元素,那么需要修正颜色和线型的分配。但用户提供的colors数组有5种颜色,linestyles有4种线型。在循环中,当ii从1到6时,颜色和线型的索引会超出范围,导致错误。例如,当ii=5时,colors的索引是5,但只有5行,可能最后一个(ii=6)使用实线,而其他使用不同的线型?
在用户代码中,循环部分:
for ii=1:length(C_value)
...
if ii == length(C_value)
plot(..., 'LineStyle','-');
else
plot(..., 'LineStyle',linestyles{ii});
end
end
假设length(C_value)为5,那么当ii=5时,用实线,其他用linestyles{1}到{4}。但原代码中的linestyles有4种,所以当C_value有5个元素时,最后一个用实线,前四个用不同的线型,第五个可能出错?
但根据用户提供的代码中的C_value,如果是6个元素,那么linestyles只有4种,当ii=5时,linestyles{5}不存在,导致错误。因此,推测用户代码可能存在错误,可能C_value应为5个元素,或者colors和linestyles的数量需要调整。
但用户的问题是关于修改图例,而不是调试代码错误。因此,假设代码中的C_value有5个元素,可能用户希望将图例更改为对应的C01/D的值。例如,原代码中的C_value是0.25:0.25:1.5,但实际可能用户意图是到1.25,即有5个元素,如0.25:0.25:1.25,这样length(C_value)=5,对应图例的5条目。
在这种情况下,用户需要将legend中的条目替换为对应的C01_D的值,即0.25, 0.5, 0.75, 1.0, 1.25。因此,在legend部分,应使用:
legend({ '$C_{01}/D=0.25$',
'$C_{01}/D=0.5$',
'$C_{01}/D=0.75$',
'$C_{01}/D=1.0$',
'$C_{01}/D=1.25$' },... )
但原代码中的legend有5个条目,而C_value可能有5个元素,这样是匹配的。
但用户提供的代码中的C_value定义是到1.5,所以可能需要检查代码是否存在问题。但根据用户的需求,他们希望将图例更改为关于C01/D的值,因此正确的做法是根据C_value的元素生成对应的图例标签,使用LaTeX格式。
因此,正确的修改是在legend部分,将原来的Q相关描述替换为C01/D的值。例如,使用循环生成对应的字符串数组:
legend_labels = arrayfun(@(x) sprintf('$C_{01}/D=%.2f$', x), C01_D, 'UniformOutput', false);
然后将其传递给legend函数。但MATLAB中,需要确保C01_D是正确计算的,即C_value/D。在用户代码中,C01_D = C_value/D,所以每个元素是0.25, 0.5, 0.75, 1.0, 1.25, 1.5。但原图例只有5个条目,可能需要检查代码中是否有错误,或者是否实际循环次数与C_value元素数量不符。
总结,用户需要将图例替换为C01/D的值,每个对应不同的C_value。因此,修改legend部分,使用C01_D的值,并确保数量与循环次数一致。例如,如果C_value有5个元素,则生成5个标签;如果有6个,则生成6个,并调整颜色和线型的数量以避免错误。</think>以下是对问题的分步解答和代码修改说明:
1. **问题分析**:
- 原代码绘制不同筒仓高度参数$C_{01}/D$下的水平土压力分布,但图例错误地显示为载荷$Q$值。
- 需将图例标签替换为$C_{01}/D$的实际比值。
2. **关键变量定位**:
- `C_value = (0.25:0.25:1.5)*D` 定义筒仓绝对高度。
- `C01_D = C_value/D` 计算无量纲高度参数,实际值为`[0.25, 0.5, 0.75, 1.0, 1.25, 1.5]`。
- 循环次数`length(C_value)=6`,但原图例仅5项,存在代码逻辑错误。
3. **代码修正**:
- **调整颜色/线型数组长度**:确保6组数据均有唯一样式。
- **修改图例生成方式**:动态生成LaTeX格式的$C_{01}/D$标签。
4. **修改后的legend部分**:
```matlab
legend_labels = arrayfun(@(x) sprintf('$C_{01}/D=%.2f$', x), C01_D, 'UniformOutput', false);
legend(legend_labels,...
'Location', 'northeast',...
'Orientation', 'vertical',...
'FontSize', 12,...
'FontName', 'Times New Roman',...
'Interpreter', 'latex',...
'Box', 'off');
```
5. **完整修改代码段**(关键部分):
```matlab
C_value=(0.25:0.25:1.5)*D; % 原始定义包含6个元素
C01_D=C_value/D; % 实际值: [0.25,0.5,0.75,1.0,1.25,1.5]
colors = jet(length(C_value)); % 使用jet色图自动分配6种颜色
linestyles = {'--', ':', '-.', '-','--','-.'}; % 扩展线型数组至6种
figure;
hold on;
for ii=1:length(C_value)
% ...原有计算代码...
plot(seigama_anw/(gamma2*D), ZZ,...
'Color', colors(ii,:),...
'LineWidth',1.5,...
'LineStyle',linestyles{ii}); % 所有线型明确指定
end
% 动态生成图例标签
legend_labels = arrayfun(@(x) sprintf('$C_{01}/D=%.2f$', x), C01_D, 'UniformOutput', false);
legend(legend_labels,...
'Interpreter','latex',...
'Box','off',...
'FontSize',12);
```
6. **修改效果**:
- 图例正确显示6种$C_{01}/D$比值:0.25至1.5。
- 颜色和线型一一对应,避免重复。
- 公式采用LaTeX渲染,显示为专业数学符号。
7. **理论背景补充**:
- $C_{01}/D$ 表征筒仓深径比,直接影响侧压力分布。
- 代码通过求解ODE `ode45` 获得应力传递规律。
- 无量纲化处理`seigama_anw/(gamma2*D)`使曲线通用化。
最终结果示意图:
横坐标:$\sigma_{h}/(\gamma H)$,纵坐标:深度比$z/D$,6条曲线清晰反映不同深径比下的土压力分布差异。
阅读全文
相关推荐










