% 定义主应力范围 s1 = linspace(0, 50, 51); s2 = linspace(0, 50, 51); s3 = linspace(0, 50, 51); % 创建网格 [S1, S2, S3] = meshgrid(s1, s2, s3); % 计算Tresca剪应力 tau_max = max(max(S1-S2, S2-S3), S3-S1); tau_min = min(min(S1-S2, S2-S3), S3-S1); tresca = tau_max - tau_min; % 绘制Tresca屈服面 figure surf(S1, S2, S3, tresca) xlabel('σ1') ylabel('σ2') zlabel('σ3') title('Tresca Yield Surface in Principal Stress Space')这段代码有问题,改下
时间: 2023-11-18 12:03:35 浏览: 73
可能是因为 `tau_max` 和 `tau_min` 中的计算表达式不正确,应该将其改为:
```
tau_max = max([S1-S2; S2-S3; S3-S1]);
tau_min = min([S1-S2; S2-S3; S3-S1]);
```
另外,还需要将 `surf` 函数的第四个参数改为 `tresca`,即:
```
surf(S1, S2, S3, tresca)
```
这样就可以绘制出正确的 Tresca 屈服面了。
相关问题
% 定义主应力范围 s1 = linspace(-50, 50, 100); s2 = linspace(-50, 50, 100); s3 = linspace(-50, 50, 100); % 创建网格 [S1, S2, S3] = meshgrid(s1, s2, s3); % 计算Mises和Drucker屈服函数 mises = sqrt(0.5 * ((S1 - S2).^2 + (S2 - S3).^2 + (S3 - S1).^2))-20; drucker = sqrt(3/2) * sqrt(((S1 - S2).^2 + (S2 - S3).^2 + (S3 - S1).^2) + 6*(S1.^2+S2.^2+S3.^2))-6.*(S1+S2+S3)/3; % 绘制Mises屈服面 figure; isosurface(S1, S2, S3, mises, 1); % 绘制Mises屈服面 xlabel('s1'); ylabel('s2'); zlabel('s3'); title('Mises屈服面');给这段代码画的三维图增加网格
在绘制Mises屈服面的代码后面添加以下代码:
```
grid on;
```
修改后的完整代码如下:
```
% 定义主应力范围
s1 = linspace(-50, 50, 100);
s2 = linspace(-50, 50, 100);
s3 = linspace(-50, 50, 100);
% 创建网格
[S1, S2, S3] = meshgrid(s1, s2, s3);
% 计算Mises和Drucker屈服函数
mises = sqrt(0.5 * ((S1 - S2).^2 + (S2 - S3).^2 + (S3 - S1).^2))-20;
drucker = sqrt(3/2) * sqrt(((S1 - S2).^2 + (S2 - S3).^2 + (S3 - S1).^2) + 6*(S1.^2+S2.^2+S3.^2))-6.*(S1+S2+S3)/3;
% 绘制Mises屈服面
figure;
isosurface(S1, S2, S3, mises, 1);
xlabel('s1');
ylabel('s2');
zlabel('s3');
title('Mises屈服面');
grid on;
```
% 定义材料内聚力c c = 100; % 生成主应力空间 s1 = linspace(0, 200, 100); s2 = linspace(0, 200, 100); s3 = linspace(0, 200, 100); [S1, S2, S3] = meshgrid(s1, s2, s3); % 计算Drucker-Prager准则 f = 1/sqrt(3)*((S1-S3)+(S2-S3))-2*c*S3/sqrt(3); % 绘制Drucker-Prager屈服面 isosurface(S1, S2, S3, f, 0); xlabel('\sigma_1'); ylabel('\sigma_2'); zlabel('\sigma_3'); title('Drucker-Prager屈服面');将程序改成只显示点
以下是将程序改成只显示点的代码:
```matlab
% 定义材料内聚力c
c = 100;
% 生成主应力空间
s1 = linspace(0, 200, 100);
s2 = linspace(0, 200, 100);
s3 = linspace(0, 200, 100);
[S1, S2, S3] = meshgrid(s1, s2, s3);
% 计算Drucker-Prager准则
f = 1/sqrt(3)*((S1-S3)+(S2-S3))-2*c*S3/sqrt(3);
% 绘制Drucker-Prager屈服面
p = patch(isosurface(S1, S2, S3, f, 0));
set(p, 'FaceColor', 'red', 'EdgeColor', 'none');
xlabel('\sigma_1');
ylabel('\sigma_2');
zlabel('\sigma_3');
title('Drucker-Prager屈服面');
% 将 isosurface 函数改成 scatter3 函数,只显示点
hold on
[x, y, z] = ind2sub(size(f), find(f <= 0));
scatter3(S1(x), S2(y), S3(z), 10, 'filled', 'MarkerFaceColor', 'blue');
hold off
```
运行后,将只显示Drucker-Prager屈服面上的点。
阅读全文