问题提出
表示多晶体材料织构的三维取向分布函数(f=f(φ1,φ,φ2))是一个非常复杂的函数,难以精确的用解析函数表达,通常采用离散空间函数值来表示取向分布函数,Data.txt是三维取向分布函数的一个实例。由于数据量非常大,不便于分析,需要借助图形来分析。请你编写一个matlab程序画出如下的几种图形来分析其取向分布特征:
(1)用Slice函数给出其整体分布特征;
(2)用pcolor或contour函数分别给出(φ2=0, 5, 10, 15, 20, 25, 30, 35 … 90)切面上f分布情况(需要用到subplot函数);
(3) 用plot函数给出沿α取向线(φ1=0~90,φ=45,φ2=0)的f分布情况。
题目要求如上,其实就是提取三维数据点阵后用slice函数,subplot和contour函数画等高线图
本题具体代码如下:
filein = 'D:\Data.txt';
fileout = 'fileout.txt';
fidin = fopen(filein, 'r');
fidout = fopen(fileout, 'w');
while ~feof(fidin)
tline = fgetl(fidin);
if double(tline(1)) == double(' ')
fprintf(fidout, '%s\n\n', tline);
end
end
fclose(fidin);
fclose(fidout);
% 读取数据
W = importdata('fileout.txt');
n = size(W, 2);
% 初始化一个三维数组 v
v = zeros(n,n,n);
% v 是从 W 中提取数据的三维数组
for i = 1:n
v(:,:,i) = W((i-1)*n+1:i*n, 1:n);
end
% 准备三维网格数据
x = 0:5:90;
y = 0:5:90;
z = 0:5:90;
[x1, y1, z1] = meshgrid(x, y, z);
%使用 slice 函数绘制三维数据的特定切片
slice(x1, y1, z1, v, [45, 90], [45, 90], [0, 45]); % 做第一题图
for i=1:19
subplot(5,4,i);
contour(x,y,v(:,:,i)) %作第二题图
end
plot(x,v(10,:,1),'o-') %作第三题图
gtext('\Phi1=45','FontSize',12)
gtext('\Phi2=0','FontSize',12)
运行效果如下:
![](https://img-blog.csdnimg.cn/direct/4e6eaa2635ac485cac993e3bd1dbd131.png)
![](https://img-blog.csdnimg.cn/direct/f56becba2dc24d248e442f7b3ce7d3c3.png)
![](https://img-blog.csdnimg.cn/direct/1086c1bbc497490f8d4d8ee303906a72.png)
代码讲解
filein = 'D:\Data.txt'; %输入文件路径
fileout = 'fileout.txt'; %输出文件路径
fidin = fopen(filein, 'r'); %打开输入文件进行读取
fidout = fopen(fileout, 'w'); %打开输出文件进行写入
while ~feof(fidin) %读取输入文件的一行
tline = fgetl(fidin);
if double(tline(1)) == double(' ') %检查第一个字符是否为空格
fprintf(fidout, '%s\n\n', tline); %如果是,写入输出文件,并添加两个换行符
end
end
fclose(fidin); %关闭输入文件
fclose(fidout); %关闭输出文件
第一部分代码用于处理待处理数据文件,由于文件中含有其他无关信息,需要根据特定需求筛选数据,再用文件输入替代大型矩阵输入。
输入输出文件对比如下
W = importdata('fileout.txt'); %读取数据
n = size(W, 2); %确定数据的列数
v = zeros(n,n,n); % 初始化一个三维数组 v
for i = 1:n
v(:,:,i) = W((i-1)*n+1:i*n, 1:n);%将数据从W导入到v的特定层
end
% 生成三维网格
x = 0:5:90;
y = 0:5:90;
z = 0:5:90;
[x1, y1, z1] = meshgrid(x, y, z);
第二部分代码将已经处理好的数据文件拆分成19部分,每部分是19*19的矩阵,对应第二题中不同φ2的取值,每个φ2的值对应一张需要画出的图片。原文件Data.txt实际上单独给出了每个φ值对应的矩阵,但被第一部分代码删除了,因此要在这里重新分离。
![](https://img-blog.csdnimg.cn/direct/f9897f06c9104bbd8f6ec75f04e47c21.png)
![](https://img-blog.csdnimg.cn/direct/177e3265969d470889df18c8651bf952.png)
slice(x1, y1, z1, v, [45, 90], [45, 90], [0, 45]); % 使用slice函数绘制v的特定切片
for i=1:19
subplot(5,4,i); %将窗口分割成5行4列,在循环中选择当前的子图区域进行绘图
contour(x,y,v(:,:,i)) %绘制等高线
end
plot(x,v(10,:,1),'o-') %选取第十行第一列的数据作为y轴
gtext('\Phi1=45','FontSize',12) %用于添加文本注释
gtext('\Phi2=0','FontSize',12)
第三部分代码用于画图,[45, 90]定义了xoy平面的旋转角度,[45, 90],[0, 45]分布定义yoz和zox平面的旋转角度,用于调整视角。slice用于绘制特定切片,contour用于绘制等高线。第十行第一列为α取向线。