Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
17
Добавлен:
11.06.2020
Размер:
1.4 Mб
Скачать

3 Выполнение работы

Работа выполняется на компьютерах класса не ниже IBM P166, RAM 16 MB с установленной программой Maple V и файлом построения зоны Бриллюэна "Brill1.mws". Самостоятельно студенты определяют базисные векторы заданных решеток, подставляют их значения в программу, анализируют и переносят в отчет результаты вычисления.

3.1 Задание

Освоить элементы программы Maple V, изучить конструкцию файла "Brill1.mws"; Начертить в отчете элементарные ячейки и указать базисные векторы решеток:

1) Примитивная кубическая;

2) ОЦК;

3) ГЦК;

4) Гексагональная примитивная;

5) Гексагональная плотноупакованная.

Построить полиэдры зоны Бриллюэна для перечисленных решеток, оформить отчет согласно требованиям.

3.2 Построение зоны Бриллюэна

Здесь приведена программа, которая рисует полиэдр, являющийся зоной Бриллюэна для заданной кристаллической решетки. Обычным шрифтом набран текст программы, т.е. то, что мы должны ввести с клавиатуры в компьютер, курсивом - результат работы Maple.

> restart: with(linalg); это первое задание, которое состоит из оператора restart, очищающего память от предыдущих запусков программы и оператора with(linalg);, с помощью которого подключается библиотека "Линейная алгебра". Поскольку оператор кончается символом ";", его выполнение сопровождается печатью двух предупреждающих сообщений (новое определение нормы и следа) и списка функций доступных после подключения пакета. Нам понадобятся такие функции пакета: crossprod - векторное произведение векторов, innerprod - скалярное произведение векторов, scalarmul - умножение векторного объекта на скаляр, matadd - матричное сложение, vector - задание вектора, norm - вычисление нормы. Конкретную информацию по каждой из этих тем вы можете получить уже сейчас, выбрав в меню Help строку Topic Search и осуществив поиск.

Warning, new definition for norm

Warning, new definition for trace

[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp, QRdecomp,

Wronskian, addcol, addrow, adj, adjoint, angle, augment, backsub,

band, basis, bezout, blockmatrix, charmat, charpoly, cholesky,

col, coldim, colspace, colspan, companion, concat, cond, copyinto,

crossprod, curl, definite, delcols, delrows, det, diag, diverge,

dotprod, eigenvals, eigenvalues, eigenvectors, eigenvects,

entermatrix, equal, exponential, extend, ffgausselim, fibonacci,

forwardsub, frobenius, gausselim, gaussjord, geneqns, genmatrix,

grad, hadamard, hermite, hessian, hilbert, htranspose, ihermite,

indexfunc, innerprod, intbasis, inverse, ismith, issimilar,

iszero, jacobian, jordan, kernel, laplacian, leastsqrs, linsolve,

matadd, matrix, minor, minpoly, mulcol, mulrow, multiply, norm,

normalize, nullspace, orthog, permanent, pivot, potential,

randmatrix, randvector, rank, ratform, row, rowdim, rowspace,

rowspan, rref, scalarmul, singularvals, smith, stack, submatrix,

subvector, sumbasis, swapcol, swaprow, sylvester, toeplitz, trace,

transpose, vandermonde, vecpotent, vectdim, vector, wronskian]

>with(plots);with(plottools); - здесь подключены библиотеки plots и plottools, с помощью которых осуществляется построение полиэдра.

[animate, animate3d, changecoords, complexplot, complexplot3d,

conformal, contourplot, contourplot3d, coordplot, coordplot3d,

cylinderplot, densityplot, display, display3d, fieldplot,

fieldplot3d, gradplot, gradplot3d, implicitplot, implicitplot3d,

inequal, listcontplot, listcontplot3d, listdensityplot, listplot,

listplot3d, loglogplot, logplot, matrixplot, odeplot, pareto,

pointplot, pointplot3d, polarplot, polygonplot, polygonplot3d,

polyhedraplot, replot, rootlocus, semilogplot, setoptions,

setoptions3d, spacecurve, sparsematrixplot, sphereplot, surfdata,

textplot, textplot3d, tubeplot]

[arc, arrow, circle, cone, cuboid, curve, cutin, cutout, cylinder,

disk, dodecahedron, ellipse, ellipticArc, hemisphere, hexahedron,

hyperbola, icosahedron, line, octahedron, pieslice, point,

polygon, rectangle, rotate, scale, semitorus, sphere, stellate,

tetrahedron, torus, transform, translate]

> node:=proc(G1,G2,G3) local v,A1,A2,A3,r1,r2,r3,pr,p,k; v:=innerprod(G1,crossprod(G2,G3)); A1:=crossprod(G2,G3);A2:=crossprod(G3,G1);A3:=crossprod(G1,G2);r1:=G1[1]^2+G1[2]^2+G1[3]^2;r2:=G2[1]^2+G2[2]^2+G2[3]^2;r3:=G3[1]^2+G3[2]^2+G3[3]^2;pr:=matadd(A1,A2,r1,r2);p:=matadd(pr,A3,1,r3);k:=scalarmul(p,-1/v/2);RETURN(eval(k)) end; - эта процедура по трем векторам обратной решетки (G1,G2,G3) определяет точку пересечения плоскостей, задаваемых этими векторами (см. Раздел 2.1).

node := proc(G1, G2, G3)

local v, A1, A2, A3, r1, r2, r3, pr, p, k;

v := innerprod(G1, crossprod(G2, G3));

A1 := crossprod(G2, G3);

A2 := crossprod(G3, G1);

A3 := crossprod(G1, G2);

r1 := G1[1]^2 + G1[2]^2 + G1[3]^2;

r2 := G2[1]^2 + G2[2]^2 + G2[3]^2;

r3 := G3[1]^2 + G3[2]^2 + G3[3]^2;

pr := matadd(A1, A2, r1, r2);

p := matadd(pr, A3, 1, r3);

k := scalarmul(p, - 1/2*1/v);

RETURN(eval(k))

end

Далее задаются базисные векторы элементарной ячейки и вычисляется ее объем. Например, для ГЦК решетки (рисунок 1):

Рисунок 1 - Определение базисных векторов в ГЦК решетке.

>a1:=vector(3,[0,1/2,1/2]);a2:=vector(3,[1/2,0,1/2]);a3:=vector(3,[1/2,1/2,0]);

va:=innerprod(a1,crossprod(a2,a3));

a1 := [0, 1/2, 1/2]

a2 := [1/2, 0, 1/2]

a3 := [1/2, 1/2, 0]

va := 1/4

>b1:=scalarmul(crossprod(a2,a3),2*Pi/va);b2:=scalarmul(crossprod(a3,a1),2*Pi/va);

b3:=scalarmul(crossprod(a1,a2),2*Pi/va); - вычисляются три базисных вектора обратной решетки.

b1 := [-2 Pi, 2 Pi, 2 Pi]

b2 := [2 Pi, -2 Pi, 2 Pi]

b3 := [2 Pi, 2 Pi, -2 Pi]

Задается последовательность цветов, которыми мы будем закрашивать грани нашего полиэдра с целью получения более наглядного объемного изображения:

>col:=[green,red,pink,purple,yellow,brown,blue,orange,gold,coral,cyan,magenta,navy,maroon,aquamarine,plum,sienna,turquose,violet,gray,grey,khaki,wheat,green,red,pink,tan].

col := [green, red, pink, purple, yellow, brown, blue, orange, gold,

coral, cyan, magenta, navy, maroon, aquamarine, plum, sienna,

turquose, violet, gray, grey, khaki, wheat, green, red, pink,

tank]

Задаются тройки целых чисел, позволяющие перечислить всех соседей, необходимых для построения зоны Бриллюэна в любой решетке:

> neigh:=[[-1,0,0],[1,0,0],[0,-1,0],[0,1,0],[0,0,-1],[0,0,1],[1,1,1],[-1,-1,-1],[1,1,0],[-1,-1,0],[1,0,1],[-1,0,-1],[0,1,1],[0,-1,-1],[-1,1,0],[1,-1,0],[-1,0,1],[1,0,-1],[0,-1,1],[0,1,-1],[-1,1,1],[1,-1,1],[1,1,-1],[-1,-1,1],[1,-1,-1],[-1,1,-1]].

neigh := [[-1, 0, 0], [1, 0, 0], [0, -1, 0], [0, 1, 0], [0, 0, -1],

[0, 0, 1], [1, 1, 1], [-1, -1, -1], [1, 1, 0], [-1, -1, 0],

[1, 0, 1], [-1, 0, -1], [0, 1, 1], [0, -1, -1], [-1, 1, 0],

[1, -1, 0], [-1, 0, 1], [1, 0, -1], [0, -1, 1], [0, 1, -1],

[-1, 1, 1], [1, -1, 1], [1, 1, -1], [-1, -1, 1], [1, -1, -1],

[-1, 1, -1]]

> for i1 from 1 to 26 do G1:=vector(3,[neigh[i1,1],neigh[i1,2],neigh[i1,3]]): NG[i1]:=0: for i2 from 1 to 26 do G2:=vector(3,[neigh[i2,1],neigh[i2,2],neigh[i2,3]]); for i3 from 1 to 26 do G3:=vector(3,[neigh[i3,1],neigh[i3,2],neigh[i3,3]]);vG:=innerprod(G1,crossprod(G2,G3));if vG<>0 then NG[i1]:=NG[i1]+1;R[i1,NG[i1]]:=node(matadd(matadd(b1,b2,neigh[i1,1],neigh[i1,2]),b3,1,neigh[i1,3]),matadd(matadd(b1,b2,neigh[i2,1],neigh[i2,2]),b3,1,neigh[i2,3]),matadd(matadd(b1,b2,neigh[i3,1],neigh[i3,2]),b3,1,neigh[i3,3]));fi;od:od:od: - вычисляются все точки, которые могут быть вершинами искомого полиэдра. Точки сгруппированы по граням в массиве R[i1,NG[i1]], где первый аргумент задает номер грани, второй - номер точки в данной грани. Вычисление основано на использовании выше написанной процедуры "node". Здесь используются операторы цикла и условный оператор. Недостающую информацию о их свойствах извлеките из "Help".

> for i1 from 1 to 26 do NVert[i1]:=0: for i from 1 to NG[i1] do L:=1; for i2 from 1 to 26 do if (i2<>i1) then G2:=matadd(matadd(b1,b2,neigh[i2,1],neigh[i2,2]),b3,1,neigh[i2,3]); NG2:=norm(G2,2)^2; if (evalf(2*innerprod(R[i1,i],G2)-NG2)>=10^(-5)) then L:=0: fi:fi:od: if (L=1) then NVert[i1]:=NVert[i1]+1;Vertex[i1,NVert[i1]]:=R[i1,i] fi;od:od: - отбраковка вершин полиэдра, которые отсекаются от центральной области хотя бы одной плоскостью.

>l1:=seq(polygon([seq([Vertex[i1,i][1],Vertex[i1,i][2],Vertex[i1,i][3]],i=1..NVert[i1])], color=col[i1],style=patchnogrid, thickness=1),i1=1..14): display(l1,scaling=constrained,axes=boxed); - построение полиэдра. Выясните с использованием Help, что означает функция "seq".

Рисунок 2 - Результат работы программы.

Выполненное построение требует около двух часов работы компьютера с процессором P166 и использует приблизительно 34 мегабайта памяти. Это слишком большая цена, которую приходится платить за удобства написания программы с использованием пакета "Линейная алгебра". Ниже приведен вариант этой же программы, в которой функции пакета используются минимально. Т.е. все векторные операции расписаны покоординатно и выполнены без обращения к функциям пакета. То же самое построение занимает уже не более пяти минут, что вполне приемлимо. Мы не пишем комментарий к этому варианту программы, т.к. она по сути та же самая. Исключение - это последний оператор, с помощью которого осуществляется вращение полиэдра относительно вертикальной оси.

> restart:with(linalg);with(plots);with(plottools);

>a1:=vector(3,[-1/2,1/2,1/2]);a2:=vector(3,[1/2,-1/2,1/2]);a3:=vector(3,[1/2,1/2,-1/2]);va:=innerprod(a1,crossprod(a2,a3));

>a1:=vector(3,[1/2,-sqrt(3)/2,0]);a2:=vector(3,[1/2,sqrt(3)/2,0]); a3:=vector(3,[0,0,1.633]);va:=innerprod(a1,crossprod(a2,a3));

>a1:=vector(3,[0,1/2,1/2]);a2:=vector(3,[1/2,0,1/2]);a3:=vector(3,[1/2,1/2,0]);va:=innerprod(a1,crossprod(a2,a3));

>b1:=scalarmul(crossprod(a2,a3),2*Pi/va);b2:=scalarmul(crossprod(a3,a1),2*Pi/va);b3:=scalarmul(crossprod(a1,a2),2*Pi/va);

>col:=[green,red,pink,purple,yellow,brown,blue,orange,gold,coral,cyan,magenta,navy,maroon,aquamarine,plum,sienna,turquose,violet,gray,grey,khaki,wheat,black,tan,green];

>neigh:=[[-1,0,0],[1,0,0],[0,-1,0],[0,1,0],[0,0,-1],[0,0,1],[1,1,1],[-1,-1,-1],[1,1,0],[-1,-1,0],[1,0,1],[-1,0,-1],[0,1,1],[0,-1,-1],[-1,1,0],[1,-1,0],[-1,0,1],[1,0,-1],[0,-1,1],[0,1,-1],[-1,1,1],[1,-1,1],[1,1,-1],[-1,-1,1],[1,-1,-1],[-1,1,-1]];

>for i1 from 1 to 26 do NG[i1]:=0: for i2 from 1 to 26 do for i3 from 1 to 26 do if (neigh[i1,1]*(neigh[i2,2]*neigh[i3,3]- neigh[i3,2]*neigh[i2,3])+ neigh[i1,2]*(neigh[i3,1]*neigh[i2,3]- neigh[i2,1]*neigh[i3,3])+ neigh[i1,3]*(neigh[i2,1]*neigh[i3,2]-neigh[i3,1]*neigh[i2,2]))<>0 then NG[i1]:=NG[i1]+1;G1x:=neigh[i1,1]*b1[1]+neigh[i1,2]*b2[1]+neigh[i1,3]*b3[1];G1y:=neigh[i1,1]*b1[2]+neigh[i1,2]*b2[2]+neigh[i1,3]*b3[2];G1z:=neigh[i1,1]*b1[3]+neigh[i1,2]*b2[3]+neigh[i1,3]*b3[3]; G2x:=neigh[i2,1]*b1[1]+neigh[i2,2]*b2[1]+neigh[i2,3]*b3[1];G2y:=neigh[i2,1]*b1[2]+neigh[i2,2]*b2[2]+neigh[i2,3]*b3[2];G2z:=neigh[i2,1]*b1[3]+neigh[i2,2]*b2[3]+neigh[i2,3]*b3[3]; G3x:=neigh[i3,1]*b1[1]+neigh[i3,2]*b2[1]+neigh[i3,3]*b3[1];G3y:=neigh[i3,1]*b1[2]+neigh[i3,2]*b2[2]+neigh[i3,3]*b3[2];G3z:=neigh[i3,1]*b1[3]+neigh[i3,2]*b2[3]+neigh[i3,3]*b3[3];A1x:=G2y*G3z-G3y*G2z;A1y:=G3x*G2z-G2x*G3z;A1z:=G2x*G3y-G3x*G2y;A2x:=G3y*G1z-G1y*G3z;A2y:=G1x*G3z-G3x*G1z;A2z:=G3x*G1y-G1x*G3y;A3x:=G1y*G2z-G2y*G1z;A3y:=G2x*G1z-G1x*G2z;A3z:=G1x*G2y-G2x*G1y;v:=2*(G1x*A1x+G1y*A1y+G1z*A1z);r1:=-(G1x^2+G1y^2+G1z^2)/v;r2:=-(G2x^2+G2y^2+G2z^2)/v;r3:=-(G3x^2+G3y^2+G3z^2)/v; R[i1,NG[i1]]:=vector(3,[r1*A1x+r2*A2x+r3*A3x,r1*A1y+r2*A2y+r3*A3y,r1*A1z+r2*A2z+r3*A3z]);fi;od:od:od:

>for i1 from 1 to 26 do NVert[i1]:=0: for i from 1 to NG[i1] do L:=1; for i2 from 1 to 26 do if (i2<>i1) then Gx:=neigh[i2,1]*b1[1]+neigh[i2,2]*b2[1]+neigh[i2,3]*b3[1]: Gy:=neigh[i2,1]*b1[2]+neigh[i2,2]*b2[2]+neigh[i2,3]*b3[2]:Gz:=neigh[i2,1]*b1[3]+neigh[i2,2]*b2[3]+neigh[i2,3]*b3[3]: if (evalf(2*(R[i1,i][1]*Gx+R[i1,i][2]*Gy+R[i1,i][3]*Gz)-Gx^2-Gy^2-Gz^2)>=10^(-5)) then L:=0:i2:=26; fi:fi:od: if (L=1) then NVert[i1]:=NVert[i1]+1;Vertex[i1,NVert[i1]]:=R[i1,i] fi;od:od:

>Face:=0: for i1 from 1 to 26 do if (NVert[i1]<>0) then Face:=Face+1: NODE[Face]:=NVert[i1]: for i from 1 to NVert[i1] do IVertex[Face,i]:=Vertex[i1,i]: od:fi:od:

>l1:=seq(polygon([seq([IVertex[i1,i][1],IVertex[i1,i][2],IVertex[i1,i][3]],i=1..NODE[i1])], color=col[i1],style=patchnogrid, thickness=1),i1=1..Face):display(l1,scaling=constrained,axes=boxed);

l2:=display(l1,scaling=constrained):display(seq(rotate(l2,0,0,J*Pi/10),J=0..20),insequence=true);

Соседние файлы в папке фтт лабы для ММ