剪切模量各向异性

类别:    标签: matlab 编程   阅读次数:   版权: (CC) BY-NC-SA

以前的博文中讲过用matlab作弹性模量(杨氏模量)的各向异性图,这里更进一步, 讲讲剪切模量各向异性的作图。

我们知道,剪切模量定义为: 在某个晶面上沿着某一特定方向施加剪切应力后剪切应力和应变的比值。它的值是和两个方向有关的.

在图中,与向量 $l$ 垂直的平面即是晶体要发生剪切的平面. 由于弹性模量的各向异性,在这一特定平面的不同方向, 施加相同的剪切应力会得到不同的剪切应变,故会得到不同的剪切模量的值。此外, 与杨氏模量不同的是,剪切模量在某一方向 $l$ 上的值还与角度 $\chi$ 有关. 这就导致剪切模量的各向异性比杨氏模量更加复杂。

虽然剪切模量的各项异性比杨氏模量复杂, 但是作图的方法没有什么本质区别. 作图的关键是它的计算.

以立方晶系为例, 其杨氏模量

相应的剪切模量为

其中

通常对剪切模量进行表征时使用其在每一方向上最大值或最小值, 这就需要我们计算剪切模量某一方向的极值.

若令 , 则 $G$ 可写为

其中

可见 $G$ 为 $m_1, m_2, m_3$ 的二次型, 可根据其正定性判断极值情况.

根据极值的必要条件, 也可对 $G$ 进行求导, 根据 $m_1, m_2, m_3$ 方程组解的情况进行判断极值情况. 求导后

其行列式

这两种情形下, 得到的极值点都为 $(0, 0, 0)$, 但显然无法满足 $m_1^2+m_2^2+m_3^2=1$ 的约束条件, 所以这两种方法都不可行.

换用最笨的方法, 直接将 $m_i$ 的表达式代入, 化简后得到 $G$ 满足的方程. 设

最终表示为简单的三角函数, 容易知道, $G$ 的最大值

$G_{max}={C_2+C_3 \over 2}+\sqrt{C_1^2+{(C_2-C_3)^2 \over 4}}$

最小值

$G_{min}= {C_2+C_3 \over 2} - \sqrt{C_1^2+{(C_2-C_3)^2 \over 4}}$

上面的推导过程可借助matlab的符号计算功能完成.

虽然有了解析的表达式, 但实际编码时很繁琐, 且大多数情况下我们并不能得到解析的公式. 所以这只是作为求极值的一种方法. 常用的数值方法中最简单的就是分割点直接计算所有值, 然后求其最大值或最小值, 复杂一点的就是利用优化的各种方法.

照例, 下面给出几种典型金属的剪切模量最大值与最小值的图像, 前者为最大值, 后者为最小值.

作图代码

aniso.m
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
function aniso
	clc; clear; clear all; close all;

	%% 设置C矩阵
	C=zeros(6);

	% 单斜晶系示例
	% Name='Tric';
	% C(1,1)=125;C(1,2)=87; C(1,3)=90; C(1,4)=0; C(1,5)=-9;C(1,6)=0;
	%			 C(2,2)=169;C(2,3)=105;C(2,4)=0; C(2,5)=-7;C(2,6)=0;
	%						C(3,3)=128;C(3,4)=0; C(3,5)=11;C(3,6)=0;
	%								   C(4,4)=53;C(4,5)=0; C(4,6)=-0.6;
	%											 C(5,5)=36;C(5,6)=0;
	%													   C(6,6)=48;

	% 六方晶系示例
	Name='Hex';
	C(1,1)=581;    C(1,2)=55;     C(1,3)=121;    C(3,3)=445; C(4,4)=240;
	C(2,2)=C(1,1); C(2,3)=C(1,3); C(5,5)=C(4,4); C(6,6)=(C(1,1)-C(1,2))/2;

	% 正交晶系示例
	% Name='Orth';
	% C(1,1)=115.9; C(1,2)=35.3;  C(1,3)=46.8;
	%				C(2,2)=174.1; C(2,3)=38.7;
	%							  C(3,3)=153.1;
	% C(4,4)=50.9;  C(5,5)=70.2;  C(6,6)=26.6;

	% 立方晶系示例
	% C11=240.20; C12= 125.60; C44= 28.20; Name='Nb';
	% C11=522.40; C12= 160.80; C44=204.40; Name='W ';
	% C11=107.30; C12= 60.90; C44= 28.30; Name='Al';
	% C11=346.70; C12= 250.70; C44= 76.50; Name='Pt';
	% C11=231.40; C12= 134.70; C44=116.40; Name='Fe';
	% C11=124.00; C12=  93.40; C44= 46.10; Name='Ag';
	% C11= 49.50; C12=  42.30; C44= 14.90; Name='Pb';
	% C11= 13.50; C12=  11.44; C44=  8.78; Name='Li';
	% C(1:3,1:3)=C12;
	% for i=1:3; C(i,i)=C11; end
	% for i=4:6; C(i,i)=C44; end

	% 赋值C矩阵对称元素
	for i=2:6; for j=1:i-1; C(i,j)=C(j,i); end; end

	%% 球坐标(二维)表面作图方法
	[theta, phi]=meshgrid( linspace(0,pi), linspace(0,2*pi) );
	L1=sin(theta).*cos(phi);
	L2=sin(theta).*sin(phi);
	L3=cos(theta);

	[V, A, Vmin, Vmax]=getE(C, L1, L2, L3); % 弹性模量
	% [V, A, Vmin, Vmax] = getG(C, theta, phi); % 剪切模量

	x=V.*L1; y=V.*L2; z=V.*L3;
	% 或使用函数将球坐标转为直角坐标
	% [x,y,z] = sph2cart(phi, pi/2-theta,V);

	fprintf('%s: Aniso=%9.4f Min=%9.4f Max=%9.4f\n', Name, A, Vmin, Vmax);
	SphPlt(x, y, z, V);

	%% 直角坐标(三维)等值面作图方法, 慢, 仅供参考
	% [x,y,z]=meshgrid(linspace(-Vmax,Vmax));
	% r=sqrt(x.^2+y.^2+z.^2);
	% L1=x./r; L2=y./r; L3=z./r;
	% theta=acos(L3); phi=atan2(L2,L1);

	% [V, A, Vmin, Vmax] = getE(C, L1, L2, L3);
	% [V, A, Vmin, Vmax] = getG(C, theta, phi);
	% fprintf('%s: Aniso=%9.4f Emin=%9.4f Emax=%9.4f\n', Name, A, Vmin, Vmax);
	% CartPlt(x, y, z, V-r, V);

	%% 设置查看方式
	axis tight; title(sprintf('%s  Aniso=%9.4f',Name,A));
	daspect([1 1 1]);
	view(45,30); % 查看角度, 根据需要更改. (30,30)可能更合适

	colormap jet; % 低版本Matlab默认的填色模式
	cbar=colorbar; title(cbar, 'GPa');

	camlight; lighting phong;

	%% 设置图片格式并输出
	set(gca,'position',[0.12,0.05, 0.6,0.85]);
	set(gcf,'position',[500,500, 380,350]); % 根据需要更改大小如[20,20,1000,900]
	set(gcf, 'PaperPositionMode', 'auto');
	print(gcf,'-dpng','-r600', [Name,'.png'])
end

%% 由C矩阵以及方向矢量L1, L2, L3计算弹性模量E
function [E, A, Emin, Emax] = getE(C, L1, L2, L3)
	S=inv(C); % 计算S矩阵
	S11=S(1,1); S12=S(1,2); S13=S(1,3); S14=S(1,4); S15=S(1,5); S16=S(1,6);
				S22=S(2,2); S23=S(2,3); S24=S(2,4); S25=S(2,5); S26=S(2,6);
							S33=S(3,3); S34=S(3,4); S35=S(3,5); S36=S(3,6);
										S44=S(4,4); S45=S(4,5); S46=S(4,6);
													S55=S(5,5); S56=S(5,6);
																S66=S(6,6);

	% 三斜晶系杨氏模量通用公式, 可用于任意晶系
	A=0;
	E=S11 * L1.^4 + S22 * L2.^4 + S33 * L3.^4 ...
	 +	(S44+2*S23) * (L2.*L3).^2 + (S55+2*S13) * (L1.*L3).^2 + (S66+2*S12) * (L1.*L2).^2 ...
	 + 2*((S14+S56) * L1.^2 +		S24 * L2.^2 +		S34 * L3.^2) .* L2.*L3 ...
	 + 2*(		S15 * L1.^2 + (S25+S46) * L2.^2 +		S35 * L3.^2) .* L1.*L3 ...
	 + 2*(		S16 * L1.^2 +		S26 * L2.^2 + (S36+S45) * L3.^2) .* L1.*L2;
	% 立方晶系杨氏模量公式, 用于和通用公式对比, 测试二者是否一致
	% A=2*(S11-S12)/S44;
	% E=S11+(1-A)*S44*( (L1.*L2).^2+(L2.*L3).^2+(L3.*L1).^2 );
	% 六方晶系杨氏模量公式, 用于和通用公式对比, 测试二者是否一致
	% E=S11*(1-L3.^2).^2+S33*L3.^4+(S44+2*S13)*(1-L3.^2).*L3.^2;

	E=1./E;

	% 数值查找极值, 可用于任意晶系
	Emin=min(E(:)); Emax=max(E(:));
	% 立方晶系极值公式, 用于和数值极值对比, 测试二者是否一致
	% Emax=1/S11; Emin=1/(S11+(1-A)*S44/3);
	% if(A>1); Emin=1/S11; Emax=1/(S11+(1-A)*S44/3); end
end

%% 由C矩阵以及球坐标theta, phi计算剪切模量G极值, 只适用于立方晶系
function [G, A, Gmin, Gmax] = getG(C, theta, phi)
	S=inv(C); % 计算S矩阵
	A=2*(S(1,1)-S(1,2))/S(4,4);

	L1=sin(theta).*cos(phi);
	L2=sin(theta).*sin(phi);
	L3=cos(theta);

	theta = theta(:); phi = phi(:);
	G = zeros(length(phi),1);
	for i=1:length(G)
		[x, Gmin] = fminbnd(@(x) Gchi(S, theta(i), phi(i), x), 0,pi); G(i) = Gmin;
		% [x, Gmax] = fminbnd(@(x) -Gchi(theta(i), phi(i), x), 0,pi); G(i) = -Gmax;
	end
	G = reshape(G, size(L1));
	Gmin=min(G(:)); Gmax=max(G(:));
end

%% 立方晶系剪切模量计算公式
function G = Gchi(S, theta, phi, chi)
	S11=S(1,1); S12=S(1,2); S44=S(4,4);

	L1=sin(theta).*cos(phi);
	L2=sin(theta).*sin(phi);
	L3=cos(theta);
	M1=cos(theta).*cos(phi).*cos(chi)-sin(phi).*sin(chi);
	M2=cos(theta).*sin(phi).*cos(chi)+cos(phi).*sin(chi);
	M3= -sin(theta).*cos(chi);

	G = 4*S11*( (L1.*M1).^2+(L2.*M2).^2+(L3.*M3).^2 ) ...
	  + 8*S12*( L1.*L2.*M1.*M2+L1.*L3.*M1.*M3+L2.*L3.*M2.*M3) ...
	  +   S44*( (L2.*M3+M2.*L3).^2+(L1.*M3+M1.*L3).^2+(L1.*M2+M1.*L2).^2 );
	G = 1./G;
end

%% 剪切模量theta, phi方向绘图, 极值
function [Gmin, Gmax] = pltGchi(theta, phi)
	chi=linspace(0, 2*pi, 200);
	G = Gchi(theta, phi, chi);
	Gmin=min(G(:));
	Gmax=max(G(:));
	plot(chi,G);
end

%% 绘制二维表面图
function SphPlt(x, y, z, v)
	% 作颜色映射曲面
	surf(x,y,z,v, 'FaceColor','interp', 'EdgeColor','none');

	% 作曲面在做坐标面的投影
	hold on
	f=1.2; % 控制投影位置
	xr=xlim; yr=ylim; zr=zlim;
	mesh(zeros(size(x))+f*xr(1), y, z, v)
	mesh(x, zeros(size(y))-f*yr(1), z, v)
	mesh(x, y, zeros(size(z))+f*zr(1), v)
	hold off

	% 作模量的某一切面图, 使用前最好注释掉上面的surf和mesh语句
	% 参考 https://www.zhihu.com/question/48734216
	% vmax=max(v(:));
	% [X,Y,Z]=meshgrid(linspace(-vmax,vmax));
	% contourslice(X,Y,Z,  X, x,y,z,[0 0]);
	% contourslice(X,Y,Z, -Y, x,y,z,[0 0]);
	% contourslice(X,Y,Z,  Z, x,y,z,[0 0]);
end

%% 绘制三维等值面图
function CartPlt(x, y, z, v, c)
	p=patch(isosurface(x,y,z,v,0));
	isocolors(x,y,z,c,p);
	isonormals(x,y,z,v,p);
	set(p,'FaceColor','interp', 'EdgeColor','none');
end

辅助推导的代码

Gexp.m
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
clc;

syms A B C D E F G m1 m2 m3 P Q R S T x

m1 = P*cos(x)+Q*sin(x);
m2 = R*cos(x)+S*sin(x);
m3 = T*cos(x);

G = A*m1^2 + B*m2^2 + C*m3^2 + 2*D*m1*m2 + 2*E*m1*m3 + 2*F*m2*m3;

G = expand(G);
G = simple(G);

G=collect(G, cos(x));
G=collect(G, sin(x));
G=collect(G, sin(2*x));

G
pretty(G)

评论

随意赞赏

微信

支付宝
◆本文地址: , 转载请注明◆
◆评论问题: https://jerkwin.herokuapp.com/category/3/博客, 欢迎留言◆


前一篇: GROMACS表面张力单位,计算及其长程校正
后一篇: Taggie:基于标签的桌面搜索工具

访问人次(2015年7月 9日起): | 最后更新: 2017-08-15 19:57:07 UTC | 版权所有 © 2008 - 2017 Jerkwin