1. Введення У цій роботі перед нами ставиться мета навчитися застосовувати деякі
чисельні методи при вирішенні
математичні завдань за допомогою ПК.
Математичне моделювання процесів і явищ у різних галузях науки і техніки є одним з основних способів отримання нових знань і технологічних рішень. Для вирішення поставленої в цьому курсовому проекті завдання необхід
мати основні навички програмування на мові «Pascal» і в об'єктно-орієнтованої середовищі «Delphi». Ці
знання можуть стати в нагоді і в майбутньому, при написанні будь-яких програм обчислювального характеру.
У даній роботі необхідно написати програму, яка б розрахувала дисперсійну характеристику планарного хвилеводу і побудувала профілі направляються в ньому ТІ-мод. Для знаходження напрямних кутів був використаний метод дихотомії (половинного поділу).
Він найбільш простий у реалізації, має відносно швидку збіжність і дозволяє легко контролювати похибку обчислень.
2. Математичне опис використаного для вирішення завдання МЕТОДУ. Нажожденіе кореня рівняння методом дихотомії. Вважаємо, що на відрізку [а, b] розташований один корінь, який необхідно уточнити з похибкою e.
Метод дихотомії, або половинного ділення, полягає в наступному. Визначаємо середину відрізка [а, b]
Х = (а + b) / 2
і обчислюємо функцію f (Х). Далі робимо
вибір, яку з двох частин відрізка взяти для подальшого уточнення кореня. Якщо ліва частина рівняння
f (x) є неперервна
функція аргументу
х, то корінь буде знаходитися в тій половині відрізка, на кінцях якої
f (x) має різні знакі.Ето буде відрізок [а, Х], тобто для чергового кроку уточнення точку b переміщаємо в середину відрізка Х і продовжуємо
процес розподілу як з початковим відрізком [а, b].
Ітераційний (повторюваний) процес будемо продовжувати до тих пір, поки інтервал [а, b] не стане менше заданої похибки e.
Слід враховувати, що
функція f (x) обчислюється з деякою абсолютною похибкою e
1. Поблизу кореня значення
функції f (x) малі за абсолютною величиною і можуть виявитися
порівнянними з похибкою її обчислення. Іншими словами, при підході до кореня ми можемо потрапити в смугу шумів 2e
1 і подальше уточнення кореня виявиться неможливим. Тому треба задати ширину смуги шумів і припинити ітераційний процес при попаданні в неї. Також необхідно мати на увазі, що при зменшенні інтервалу [а, b]
збільшується похибка обчислення його довжини (b - а) за рахунок віднімання близьких чисел.
Метод дихотомії дозволяє значно зменшити обсяг обчислень у порівнянні з графічним методом. Так як за кожну ітерацію інтервал, де розташований корінь, зменшується в два рази, то через n ітерацій інтервал буде дорівнює (b - а) / 2
n. За 10 ітерацій інтервал зменшиться в 2
10 = 1024 разів, за 20 ітерацій - в 2
20 = 1048576 разів.
3. Опис алгоритму розв'язання задачі та схема алгоритму.
Основне завдання, що вирішується в цій програмі, це рішення наведеного далі рівняння щодо
:
, (3.1)
де
| - Товщина хвилеводу;
|
| - Довжина хвилі запускається пучка світла;
|
| - Спрямовує кут;
|
| - Порядок моди;
|
| - Показники заломлення хвилеводу і оточуючих його речовин.
|
У програмі рішення даного рівняння реалізавано методом дихотомії, схема якого наведена нижче.
Малюнок 3.1 - блок-схема методу дихотомії.
|
Далі, використовуючи отримані значення напрямних кутів, будується графік, що відображає профілі ТІ-мод. Графік, що відображає праву частину рівняння (3.1), практичної цінності для розв'язання завдання не має і носить чисто ілюстративний характер.
4. ОПИС ПРОГРАМИ.
Вид програми представлений на малюнку 4.1. По своїй зовнішній формі вона являє собою 4 закладку, розташовані на 1 формою. На першій закладці здійснюється введення вихідних даних, на другий будується графік дисперсійної характеристики хвилеводу, на третій виводяться значення напрямних кутів, а на четвертій будуються профілі ТІ-мод.
Малюнок 4.1 - Основний вид програми, закладка для введення вихідних даних.
|
Всі обчислення і побудови графіків проводяться при зміні закладки з першої на будь-яку іншу (
подія об'єкта TPageControl «OnChange»). Перед зміною (подія «OnChanging») здійснюється перевірка на повноту вихідних даних: якщо хоч в одному з вікон залишилося стоїть за замовчуванням число "0", то зміни закладки не станеться, зате виникне
інформаційне вікно, яке вкаже користувачеві на його помилку. При повторному переході з першої закладки на іншу буде зроблений перерахунок.
Обчислення напрямних кутів здійснюється з вказаною в завданні точністю - 0,001.
Повна схема і лістинг програми знаходяться в додатку А і В відповідно.
5. Результати рішення, їх інтерпретація та висновки по виконаній роботі. 5.1. результати роботи програми. Розрахунки проводилися при наступних вихідних даних:
Малюнок 5.1 - введення вихідних даних у програму.
|
За таких введених параметрах програма розрахувала наступну дисперсійну характеристику:
Малюнок 5.2 - дисперсійна характеристика хвилеводу.
|
Підраховані напрямні кути склали:
Малюнок 5.3 - напрямні кути ТІ-мод.
|
І при цих кутах програма побудувала ось такі профілі ТІ-мод:
Малюнок 5.4 - профілі ТІ-мод.
|
5.2. Результати перевірки в пакеті «MathCAD». За аналогічних вихідних даних «MathCAD» видав наступні результати:
Малюнок 5.5 - графік дисперсійної характеристики, отриманий за допомогою пакету «MathCAD».
|
|
Малюнок 5.6 - графік з профілями ТІ-мод, отриманий за допомогою пакету «MathCAD»
|
Повний лістинг вирішення поставленого завдання в пакеті «MathCAD» наведено у додатку С.
5.3. Інтерпретація результатів і висновки по виконаній роботі. Провівши
порівняльний аналіз результатів, отриманих за допомогою написаної в «Delphi» програми та пакету «MathCAD», ми бачимо їх повний збіг в межах заданої похибки. Крім
того, кінцеві результати, а
саме профілі ТІ-мод, збігаються з довідковими:
Малюнок 5.7 - три нижчі ТІ-моди асиметричного планарного хвилеводу і відповідні їм зигзагоподібні промені.
|
З цього можна зробити висновок, що поставлена задача була вирішена мною вірно і в повному обсязі. Я не тільки створив кінцевий програмний продукт, обмежено придатний для практичного використання, а й отримав практичні навички програмування в об'єктно орієнтованої середовищі «Delphi».
6. Список використаної літератури: 1. «Чисельні методи для ПЕОМ на мовах Бейсік, Фортран та Паскаль». А. Є. Мудров - МП «Раско», Томськ, 1992р, 270с.
2. «Оптичні хвилі в кристалах». А. Ярів, П. ЮХ - видавництво «Світ»,
Москва, 1987р, 616с.
Додаток А. Блок-схема тіла основної програми. Рисунок А.1 - блок-схема тіла основної програми.
|
nn1, nn2, nn3 - показники заломлення, вихідні дані, що вводяться користувачем;
dd - товщина хвилеводу, вводиться користувачем;
wll - довжина хвилі використовуваного світла, вводиться користувачем.
Блок-схема Процедури «OnChanging». Рисунок А.2 - блок-схема процедури «OnChanging».
|
AllowChange - властивість об'єкта TPageControl, що
відповідає за дозвіл / невирішення зміни закладки;
mtInformation - інформаційне вікно, що повідомляє користувача про те, що він ввів не всі вихідні дані.
Блок-схема Процедури «OnChange». Рисунок А.3 - блок-схема процедури «OnChange».
|
i - змінна типу boolean, яка відповідає за те, чи буде при зміні закладки здійснено перерахунок;
chart1 - графік, що відображає дисперсійну характеристику хвилеводу;
chart2 - графік, що відображає профілі ТІ-мод;
stringgrid1 - таблиця, яка по ходу виконання програми заповнюється значеннями напрямних кутів;
n - змінна типу byte,
відповідна порядку моди;
a, b -
змінні, що задають діапазон, на якому проводиться уточнення напрямних кутів;
dwl - функція, що задає дисперсійну характеристику хвилеводу (чисельно дорівнює правій частині рівняння (3.1));
dix - процедура, що здійснює одну ітерацію методу дихотомії;
k - допоміжна переменнная типу integer, використовувана для побудови графіка;
f (k), g (k) - функції від k, що виступають у ролі аргументу для інших функцій;
e1, e2, e3 - функції, що визначають профіль моди в різних середовищах.
Блок-схема процедури «dix». Рисунок А.4 - блок схема процедури «dix».
|
х1, х2, хm - крайні та середнє значення інтервалу, на якому проводиться уточнення кореня;
y1, y2 ym - значення уточнюються функції від x1, x2 і xm відповідно;
xx1, xx2, xxm - нові крайні та середнє значення інтервалу, отримані після його зменшення вдвічі.
Додаток В. Модуль форми Form1. unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,
jpeg, ComCtrls, TeEngine, Series, TeeProcs,
Chart, math, Grids, Menus;
type
TForm1 = class (TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Image1: TImage;
Image2: TImage;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
TabSheet3: TTabSheet;
Chart1: TChart;
TabSheet4: TTabSheet;
Chart2: TChart;
StringGrid1: TStringGrid;
MainMenu1: TMainMenu;
File1: TMenuItem;
Exit1: TMenuItem;
Help1: TMenuItem;
About1: TMenuItem;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
procedure Edit1KeyPress (Sender: TObject; var Key: Char);
procedure Edit2KeyPress (Sender: TObject; var Key: Char);
procedure Edit3KeyPress (Sender: TObject; var Key: Char);
procedure Edit4KeyPress (Sender: TObject; var Key: Char);
procedure Edit5KeyPress (Sender: TObject; var Key: Char);
procedure PageControl1Changing (Sender: TObject;
var AllowChange: Boolean);
procedure PageControl1Change (Sender: TObject);
procedure FormActivate (Sender: TObject);
procedure Exit1Click (Sender: TObject);
procedure About1Click (Sender: TObject);
private
{Private declarations}
public
i: boolean;
nn1, nn2, nn3, dd, wll: real;
{Public declarations}
end;
var
Form1: TForm1;
implementation
uses Unit4;
{$ R *. dfm}
procedure TForm1.Edit1KeyPress (Sender: TObject; var Key: Char);
begin
case key of
"0" .. '9 ', chr (8):;
'-': If length (edit1.text) <> 0 then key: = chr (0) else key: = chr (45);
'.': If pos (',', edit1.text) <> 0 then key: = chr (0) else key: = chr (44);
',': If pos (',', edit1.text) <> 0 then key: = chr (0) else key: = chr (44);
else key: = chr (0);
end;
end;
procedure TForm1.Edit2KeyPress (Sender: TObject; var Key: Char);
begin
case key of
"0" .. '9 ', chr (8):;
'-': If length (edit2.text) <> 0 then key: = chr (0) else key: = chr (45);
'.': If pos (',', edit2.text) <> 0 then key: = chr (0) else key: = chr (44);
',': If pos (',', edit2.text) <> 0 then key: = chr (0) else key: = chr (44);
else key: = chr (0);
end;
end;
procedure TForm1.Edit3KeyPress (Sender: TObject; var Key: Char);
begin
case key of
"0" .. '9 ', chr (8):;
'-': If length (edit3.text) <> 0 then key: = chr (0) else key: = chr (45);
'.': If pos (',', edit3.text) <> 0 then key: = chr (0) else key: = chr (44);
',': If pos (',', edit3.text) <> 0 then key: = chr (0) else key: = chr (44);
else key: = chr (0);
end;
end;
procedure TForm1.Edit4KeyPress (Sender: TObject; var Key: Char);
begin
case key of
"0" .. '9 ', chr (8):;
'-': If length (edit4.text) <> 0 then key: = chr (0) else key: = chr (45);
'.': If pos (',', edit4.text) <> 0 then key: = chr (0) else key: = chr (44);
',': If pos (',', edit4.text) <> 0 then key: = chr (0) else key: = chr (44);
else key: = chr (0);
end;
end;
procedure TForm1.Edit5KeyPress (Sender: TObject; var Key: Char);
begin
case key of
"0" .. '9 ', chr (8):;
'-': If length (edit5.text) <> 0 then key: = chr (0) else key: = chr (45);
'.': If pos (',', edit5.text) <> 0 then key: = chr (0) else key: = chr (44);
',': If pos (',', edit5.text) <> 0 then key: = chr (0) else key: = chr (44);
else key: = chr (0);
end;
end;
procedure TForm1.PageControl1Changing (Sender: TObject;
var AllowChange: Boolean);
begin
allowchange: = tschng (strtofloat (edit1.text), strtofloat (edit2.text), strtofloat (edit3.text), strtofloat (edit4.text), strtofloat (edit5.text));
end;
procedure TForm1.PageControl1Change (Sender: TObject);
/ / Основна процедура програми, прив'язана до зміни закладки
/ / По її ходу і здійснюються всі обчислення і побудова графіків
var
n: byte;
k: integer;
a, b, c, f: real;
begin
nn1: = strtofloat (edit1.text);
nn2: = strtofloat (edit2.text);
nn3: = strtofloat (edit3.text);
dd: = strtofloat (edit4.text) / 1000000;
wll: = strtofloat (edit5.text) / 1000000000;
if pagecontrol1.activepage = (tabsheet1) then
begin
i: = false;
chart1.RemoveAllSeries;
chart2.RemoveAllSeries;
stringgrid1.rowcount: = (2);
stringgrid1.Height: = (52);
stringgrid1.Cells [0,1 ]:=(' ');
stringgrid1.Cells [1,1 ]:=(' ');
end
else
begin
if i = false then
begin
n: = 0;
while dwl (n, (arcsin (nn1/nn2) +0.00005), nn1, nn2, nn3) <(dd / wll) do
begin
a: = (arcsin (nn1/nn2) +0.001);
b: = (pi/2-0.001);
c: = (a + b) / 2;
while (abs (dwl (n, a, nn1, nn2, nn3)-dwl (n, b, nn1, nn2, nn3))> 0.001) or (abs (ab)> 0.001) do
begin
dix (a, b, c, (dwl (n, a, nn1, nn2, nn3) - (dd / wll)), (dwl (n, b, nn1, nn2, nn3) - (dd / wll)), (dwl (n, c, nn1, nn2, nn3) - (dd / wll)), a, b, c);
end;
stringgrid1.Cells [0, n +1]: = floattostr (n);
stringgrid1.Cells [1, n +1]: = floattostr (a);
stringgrid1.RowCount: = (stringgrid1.RowCount +1);
if n <14 then stringgrid1.Height: = (stringgrid1.Height +26);
n: = n +1;
end;
stringgrid1.RowCount: = (stringgrid1.RowCount-1);
stringgrid1.Height: = (stringgrid1.Height-26);
for n: = 0 to (stringgrid1.RowCount-2) do
begin
Chart1.AddSeries (TlineSeries.Create (Self));
chart1.Serieslist [n]. SeriesColor: = chart1.getfreeseriescolor (false);
for k: = 0 to 269 do
begin
f: = (arcsin (nn1/nn2) + k * (((pi / 2)-0.001-arcsin (nn1/nn2)) / 300));
chart1.Series [n]. AddXY (k, dwl (n, f, nn1, nn2, nn3 ),'', clteecolor);
end;
end;
Chart1.AddSeries (TlineSeries.Create (Self));
for k: = 1 to 269 do
begin
chart1.Series [chart1.SeriesCount-1]. AddXY (k, (dd / wll ),'', clteecolor);
end;
for n: = 0 to (stringgrid1.RowCount-2) do
begin
Chart2.AddSeries (TlineSeries.Create (Self));
chart2.Serieslist [n]. SeriesColor: = chart2.getfreeseriescolor (false);
for k: = (99) to 0 do
begin
chart2.Series [n]. AddXY (k, e1 (wll, dd, nn1, nn2, nn3, strtofloat (stringgrid1.Cells [1, n +1]), (k * dd/100 )),'', clteecolor );
end;
for k: = 0 to 99 do
begin
chart2.Series [n]. AddXY (k, e2 (wll, dd, nn1, nn2, nn3, strtofloat (stringgrid1.cells [1, n +1]), (k * dd/100 )),'', clteecolor );
end;
for k: = 100 to 199 do
begin
chart2.Series [n]. AddXY (k, e3 (wll, dd, nn1, nn2, nn3, strtofloat (stringgrid1.Cells [1, n +1]), (k * dd/100 )),'', clteecolor );
end;
end;
label7.Caption: = floattostrf (arcsin (nn1/nn2), ffgeneral, 3,3);
label8.caption: = floattostrf ((pi/2-0.001- (pi/2-arcsin (nn1/nn2)) / 300), ffgeneral, 3,3);
label10.Caption: = floattostr (-dd * 1000000);
label11.Caption: = floattostr (2 * dd * 1000000);
i: = true;
end;
end;
end;
procedure TForm1.FormActivate (Sender: TObject);
begin
i: = false;
stringgrid1.Cells [0,0 ]:=(' Порядок ');
stringgrid1.Cells [1,0 ]:=(' Кут (рад) ');
end;
procedure TForm1.Exit1Click (Sender: TObject);
begin
close;
end;
procedure TForm1.About1Click (Sender: TObject);
begin
messagedlg ('
Курсова робота з інформатики, ТУСУР,'
+ # 13 + '1 курс, спеціальність 210405.'
+ # 13 + 'Виконав
студент групи 164'
+ # 13 + 'Філатов Олександр.', Mtinformation, [mbOK], 0);
end;
end.
Допоміжний модуль, що містить математичні процедури і функції. unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, jpeg, ComCtrls, TeEngine, Series, TeeProcs,
Chart, math;
function tschng (n1, n2, n3, d, wl: real): boolean;
function dwl (m: byte; tetta, n1, n2, n3: real): real;
function q (wl, tetta, n2, n1: real): real;
function h (wl, tetta, n2: real): real;
function p (wl, tetta, n2, n3: real): real;
function e1 (wl1, d1, n11, n21, n31, tetta1, x1: real): real;
function e2 (wl2, d2, n12, n22, n32, tetta2, x2: real): real;
function e3 (wl3, d3, n13, n23, n33, tetta3, x3: real): real;
procedure dix (x1, x2, xm, y1, y2, ym: real; var xx1, xx2, xxm: real);
implementation
function tschng (n1, n2, n3, d, wl: real): boolean;
/ / Здійснює перевірку вихідних даних на повноту
begin
if (n1 = 0) or (n2 = 0) or (n3 = 0) or (d = 0) or (wl = 0) then
begin
messagedlg ('Ви повинні ввести значення всіх параметрів!', mtinformation, [mbOK], 0);
tschng: = (False);
end
else
tschng: = (True);
end;
function dwl (m: byte; tetta, n1, n2, n3: real): real;
/ / Функція дисперсійної характеристики хвилеводу
var
aa, bb, cc, dd: real;
begin
aa: = sqrt (1-sqr (sin (tetta)));
aa: = 1 / (2 * pi * n2 * aa);
bb: = sqrt (sqr (n2 * sin (tetta))-sqr (n3));
cc: = sqrt (sqr (n2 * sin (tetta))-sqr (n1));
dd: = n2 * sqrt (1-sqr (sin (tetta)));
dwl: = aa * (arctan (bb / dd) + arctan (cc / dd) + pi * m);
end;
function q (wl, tetta, n2, n1: real): real;
/ / Функція, що обчислює хвильове число q
begin
q: = (2 * pi * sqrt (sqr (n2 * sin (tetta))-n1 * n1)) / wl;
end;
function h (wl, tetta, n2: real): real;
/ / Функція, що обчислює хвильове число h
begin
h: = (2 * pi * cos (tetta) * n2) / wl;
end;
function p (wl, tetta, n2, n3: real): real;
/ / Функція, що обчислює хвильове число p
begin
p: = (2 * pi * sqrt (sqr (n2 * sin (tetta))-n3 * n3)) / wl;
end;
function e1 (wl1, d1, n11, n21, n31, tetta1, x1: real): real;
/ / Функція, що задає профіль Еу ТІ моди за умови х <= 0
begin
e1: = exp (q (wl1, tetta1, n21, n11) * x1);
end;
function e2 (wl2, d2, n12, n22, n32, tetta2, x2: real): real;
/ / Функція, що задає профіль Еу ТІ моди за умови 0 <х <d
begin
e2: = (q (wl2, tetta2, n22, n12) / h (wl2, tetta2, n22)) * (sin (x2 * h (wl2, tetta2, n22)) + (h (wl2, tetta2, n22) / q (wl2, tetta2, n22, n12)) * cos (h (wl2, tetta2, n22) * x2));
end;
function e3 (wl3, d3, n13, n23, n33, tetta3, x3: real): real;
/ / Функція, що задає профіль Еу ТІ моди за умови х> = d
begin
e3: = (q (wl3, tetta3, n23, n13) / h (wl3, tetta3, n23)) * (sin (d3 * h (wl3, tetta3, n23)) + (h (wl3, tetta3, n23) / q (wl3, tetta3, n23, n13)) * cos (h (wl3, tetta3, n23) * d3)) * exp (-p (wl3, tetta3, n23, n33) * (x3-d3));
end;
procedure dix (x1, x2, xm, y1, y2, ym: real; var xx1, xx2, xxm: real);
/ / Процедура, що здійснює 1 ітерацію методу дихотомії
begin
if (y1 * ym) <0 then
begin
xx1: = x1;
xx2: = xm;
xxm: = (x1 + xm) / 2;
end;
if (ym * y2) <0 then
begin
xx1: = xm;
xx2: = x2;
xxm: = (xm + x2) / 2;
end;
end;
end.
Додаток c.