%与瑞士 和 东北大学上部筒仓体q对比 clc;clear;close all; H=10;gamma2=20;fai1=deg2rad(32);L=5;B=5; %参数 cc1=0.025*gamma2*H;Q=0; delta=0.7*fai1; alpha2=pi/4+fai1/2; Ka=(1-sin(fai1))./(1+sin(fai1)); theta=pi/2-1/2.*(asin(sin(delta)./sin(fai1)))+delta./2; theta2=pi/4+fai1/2; beita=0; 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_12=-2.*sin(theta)^2./(3.*(sin(theta)^2+Ka.*cos(theta)^2)); 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; %大主应力侧压力系数 % %Kanw=3.*(cos(theta2).^2+Ka.*sin(theta2).^2)./(3-(1-Ka).*cos(theta2).^2);%小主应力侧压力系数 % P=2.*cc1.*sqrt(Ka).*(f_32-f_31.*f_12./f_11); % E=f_31./f_11; % J=2*(B+L)./(B*L); % tspan=[0 9.99]; % f=@(z3,q3) [gamma2-J.*(E.*q3+P)]; %q3为平均竖向应力 % q30=Q; % [z3,q3]=ode45(f, tspan, q30);%东北大学求解 % % %东北大学显示表达式 % z=[0:0.1:9.99] % for kk=1:length(z) % q4(kk)=(gamma2-J.*P)./(J.*E)+(Q-(gamma2-J.*P)./(J.*E)).*exp(-J.*E.*z(kk)) % end % Kanw1=3.*(cos(theta2).^2+Ka.*sin(theta2).^2)./(3-(1-Ka).*cos(theta2).^2); % Kanw2=3.*(cos(theta2).^2+Ka.*sin(theta2).^2)./(3-(1-Ka).*cos(theta2).^2); % B1=cc1.*(1-Ka).*((Kanw1.*cos(theta).^2)./3-sin(theta).^2)./tan(fai1); % x1=Kanw2.*tan(fai1).*2.*(B+L)./(B*L); % x2=gamma2-2.*cc1.*(B+L).*(1+(1-Ka).*(((Kanw2*cos(theta2).^2)/3)-sin(theta2).^2))./(B.*L); % tspan=[0 9.99]; % f=@(z1,q) [x2-x1*q] %q为平均竖向应力 % q0=Q; % [z1,q]=ode45(f, tspan, q0)%自己公式求解 % seigema_h1=q.*Kanw1; Kanw1=3.*(cos(theta2).^2+Ka.*sin(theta2).^2)./(3-(1-Ka).*cos(theta2).^2); Kanw2=3.*(cos(theta2).^2+Ka.*sin(theta2).^2)./(3-(1-Ka).*cos(theta2).^2); % B1=cc1.*(1-Ka).*((Kanw1.*cos(theta).^2)./3-sin(theta).^2)./tan(fai1); % x1=(f_31./f_11).*2.*(B+L)./(B*L); % x2=2.*(B+L)./(B*L).*(f_32-(f_31.*f_12)./f_11).*2.*cc1.*sqrt(Ka); % tspan=[0 9.99]; % f=@(z1,q) [gamma2-x1.*q+x2] %q为平均竖向应力 % q0=Q; % [z1,q]=ode45(f, tspan, q0)%自己公式求解 % seigema_h1=q.*Kanw1+(f_22-(f_21.*f_12)./f_11).*2.*cc1.*sqrt(Ka); P=2.*cc1.*sqrt(Ka).*(f_32-f_31.*f_12./f_11); E=f_31./f_11; J=2*(B+L)./(B*L); z1_value=[0:0.1:9.99] for ii=1:length(z1_value) z1=z1_value(ii); q2(ii)=(gamma2-J.*P)./(J.*E)+(Q-(gamma2-J.*P)./(J.*E)).*exp(-J.*E.*z1); seigema_h1(ii)=q2(ii).*Kanw1; end h=[0:0.1:9.99]; omiga=pi/2-alpha2; R=B*H*tan(omiga)./(2*(B+H*tan(omiga))); for k=1:length(h) %瑞士公式求解(用大主应力系数) q20(k)=(R*gamma2-cc1).*(1-exp(-Kanw0.*tan(fai1)*h(k)./R))./(Kanw0.*tan(fai1))+Q*exp(-Kanw0.*h(k).*tan(fai1)); end seigema_h2=q20.*Kanw1; plot(seigema_h1,z1/H,'-r','Linewidth',2) hold on; plot(seigema_h2,h/H, '--b', 'LineWidth', 1.5,'Marker', 's', 'MarkerIndices', 1:10:length(seigema_h2), 'MarkerFaceColor', 'b') hold on; set(gca,'LineWidth',1.5,'FontSize',10,'FontName','Times New Roman'); grid off box off hold off; xlabel('$\sigma_{\mathrm{h}} \, /(\mathrm{kPa})$','Interpreter', 'latex','FontSize', 14,'FontName', 'Times New Roman'); ylabel('h/(m)','FontSize',14,'FontName','Times New Roman'); axis ij; legend({'本文解', 'G Anagnostou'}, 'Location', 'northeast', 'Orientation', 'vertical', 'Interpreter', 'tex', 'FontSize', 12, 'FontName', 'STSong','Box','off'); 为什么plot(seigema_h1,z1/H,'-r','Linewidth',2)这个图画不出来
时间: 2025-06-18 12:21:35 浏览: 5
<think>嗯,用户的问题是关于在MATLAB中绘图时,`plot(seigema_h1,z1/H,'-r','Linewidth',2)` 这个命令画不出图来。我需要仔细分析用户提供的代码,找出可能的原因。
首先,用户提到他们比较了两种方法:瑞士的公式和东北大学的筒仓体解。代码中有很多注释掉的段落,可能是在调试不同部分。现在的问题是`seigema_h1`和`z1/H`的绘图无法显示。
我需要检查几个方面:
1. **变量是否存在或正确生成**:确认`seigema_h1`和`z1`是否被正确计算并存储。在代码中,用户使用循环计算`seigema_h1(ii)`,而`z1_value`被定义为`[0:0.1:9.99]`,之后在循环中,每个`z1`被赋值为`z1_value(ii)`,但循环结束后,`z1`可能只保留了最后一个值。这里可能存在变量名混淆的问题,比如绘图时使用的是`z1/H`,而`z1`可能是一个标量而非数组。
2. **变量作用域问题**:在循环中,用户可能错误地覆盖了`z1`变量。例如,`z1_value`被定义为数组,但在循环内部,每次迭代都使用`z1 = z1_value(ii)`,导致`z1`在循环结束后仅保留最后一个值。绘图时,`z1/H`可能只是一个数值,而非数组,导致绘图失败。
3. **绘图参数是否正确**:检查绘图命令中的参数是否正确,例如`seigema_h1`和`z1/H`的维度是否匹配,是否存在NaN或Inf值,或者数据是否全为零等。
4. **坐标轴方向问题**:用户使用了`axis ij`,这会反转Y轴,可能导致图形显示异常,但通常不会导致图形完全不显示。
5. **图形被覆盖或隐藏**:检查是否存在`hold on`或`hold off`的错误使用,导致之前的图形被清除。
接下来,逐步分析代码:
用户定义`z1_value = [0:0.1:9.99]`,然后循环计算`q2(ii)`和`seigema_h1(ii)`。循环内部,每次`z1`被赋值为`z1_value(ii)`,但循环结束后,`z1`的值是最后一个元素9.99。而绘图时使用`z1/H`,H=10,所以`z1/H`变为0.999,而`seigema_h1`是一个数组。此时,`plot(seigema_h1, 0.999, ...)`尝试用一组x值和一个单一的y值绘图,这会导致水平线,但可能被其他图形覆盖,或者用户误以为没有图像。
正确的做法应该是将`z1/H`也存储为一个数组,比如`z1_plot = z1_value/H`,然后在绘图时使用`plot(seigema_h1, z1_plot, ...)`。用户可能在变量命名上犯了错误,将`z1_value`误写为`z1`,导致绘图时维度不匹配。
因此,问题根源在于变量`z1/H`实际上是标量而非数组,导致绘图失败。需要修正为使用`z1_value/H`作为Y轴数据。</think>在分析您的代码后,发现绘图不显示的主要原因是**变量作用域错误**和**维度不匹配**。以下是具体诊断和解决方案:
---
### 一、问题定位
#### 关键错误点:
```matlab
z1_value = [0:0.1:9.99]; % 正确生成的Y轴坐标数组
for ii = 1:length(z1_value)
z1 = z1_value(ii); % 循环内覆盖变量z1
q2(ii) = ...; % 正确计算q2数组
seigema_h1(ii) = ...; % 正确计算σ_h数组
end
% 绘图时错误调用:
plot(seigema_h1, z1/H, ...) % 实际z1此时为标量9.99
```
- **错误本质**:循环内`z1`被覆盖为标量,最终`z1/H`仅为一个数值(9.99/10=0.999),导致绘图时所有数据点Y坐标均为0.999(表现为水平线)
- **维度验证**:
`size(seigema_h1)` = `1x100`
`size(z1/H)` = `1x1`
---
### 二、修复方案
#### 修改代码:
```matlab
% 修改循环后的绘图部分
z1_plot = z1_value / H; % 生成完整的Y轴坐标数组
plot(seigema_h1, z1_plot, '-r', 'LineWidth', 2)
```
#### 修改后验证:
```matlab
disp(['seigema_h1长度: ', num2str(length(seigema_h1))]);
disp(['z1_plot长度: ', num2str(length(z1_plot))]);
% 应输出:
% seigema_h1长度: 100
% z1_plot长度: 100
```
---
### 三、完整修正代码段
```matlab
% 原计算部分保持不变
z1_value = [0:0.1:9.99];
for ii = 1:length(z1_value)
z1 = z1_value(ii);
q2(ii) = (gamma2 - J*P)/(J*E) + (Q - (gamma2 - J*P)/(J*E)) * exp(-J*E*z1);
seigema_h1(ii) = q2(ii) * Kanw1;
end
% 修正绘图调用
z1_plot = z1_value / H; % 新增Y轴坐标数组
plot(seigema_h1, z1_plot, '-r', 'LineWidth', 2) % 修正后的绘图命令
```
---
### 四、辅助调试建议
1. **数据可视化检查**:
```matlab
figure;
subplot(2,1,1); plot(seigema_h1); title('σ_h数值变化');
subplot(2,1,2); plot(z1_plot); title('Y轴坐标变化');
```
- 确保σ_h有合理变化范围(不应全为0或NaN)
- 确认Y轴坐标从0到1线性分布
2. **坐标范围验证**:
```matlab
disp(['σ_h范围: ', num2str(min(seigema_h1)), ' ~ ', num2str(max(seigema_h1))]);
disp(['Y轴范围: ', num2str(min(z1_plot)), ' ~ ', num2str(max(z1_plot))]);
```
---
### 五、可能残留问题排查
若修正后仍不显示图形,需检查:
1. **坐标轴方向冲突**
`axis ij`将Y轴设为向下增长,可能导致显示异常,可尝试:
```matlab
axis normal % 恢复默认坐标系
```
2. **图形覆盖问题**
检查`hold on`/`hold off`的使用顺序,确保绘图环境清洁:
```matlab
clf; % 绘图前清空画布
```
通过上述修正,您的对比曲线应能正常显示。建议在调试时逐步执行代码段,实时观察变量变化。
阅读全文
相关推荐










