Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МВ до ЛР ПАМіКГ 11-12 (1 сем) (заочн).doc
Скачиваний:
1
Добавлен:
21.02.2016
Размер:
178.18 Кб
Скачать

Методичні вказівки до лабораторних робіт з дисципліни “Програмування, алгоритмічні мови і комп’ютерна графіка” для студентів спеціальності “Автоматика і автоматизація на транспорті”

Вступ

Дисципліни “Комп’ютерна техніка і організація обчислювальних робіт” та “Програмування і алгоритмічні мови” (ПАМ) є складовими комплексного навчального курсу “Комп’ютерні технології”. Метою дисципліни ПАМ є вивчення алгоритмізації і програмування задач науково-технічного характеру для ОС Windows сучасною об’єктно-орієнтованою мовою системи візуального програмування із застосуванням чисельних методів.

Лабораторна робота № 1 Чисельне інтегрування

Мета роботи:Навчитись застосовувати в програмуванні практичних задач оператори розгалуження і циклу.

1. Методичні поради до створення програми

Складемо програму, яка на заданому користувачем відрізку обчислює із заданою допустимою похибкоювизначений інтеграл від вибраної ним зі списку функціїy(x). Для обчислення інтеграла скористаємось інтуїтивно зрозумілим методом прямокутників, який використовується для геометричної інтерпретації визначеного інтеграла як площі, охопленої графіком функції.

Загальний інтервал інтегрування при обчисленні методом прямокутників розбивають наnелементарних інтервалів дискретизаціїdx. Довжина кожного елементарного інтервалу дискретизації dx=(b-a)/n. Границями елементарних інтервалів є точкиx0,x1,x2,…xn, деx0=a,xn=b. На кожному з елементарних інтервалів площа трапецієподібної фігури, обмеженої графіком функціїy(x), замінюється площею елементарного прямокутника, внаслідок чого приблизне значення інтеграла можна обчислити за формулою.

Похибка обчислення nзалежить від кількості прямокутниківn. Наперед невідомо, яку кількість прямокутниківnпотрібно взяти, щоб одержати результат Snіз задовільною похибкоюn≤. Тому користуються ітераційним методом, виконуючи обчислення декілька разів, поступово збільшуючиnі контролюючи поточну похибкуn. Під поточною похибкою будемо розуміти абсолютне значення різниці між поточним Snі попереднім Spрезультатом (а не точним, який невідомий). Обчислення зупиняють або після досягнення заданої точності (εn≤ ε), або після того, як кількість прямокутників досягне надто великого значенняnmax. Остання умова виключає можливість нескінченного ітераційного процесу через неможливість досягнення заданої точності або через непомічені помилки в програмі.

Результатами обчислення будемо вважати значення інтеграла Sn, результуючу похибкуnі кількість елементарних прямокутниківn, при якій ця похибка досягнута.

Вікно програми показане на рис. 5.1.

Рис. 5.1. Вікно програми для обчислення визначеного інтеграла

Основна частина тексту програми приведена нижче.

namespace WindAppIntegral

{

public partial class Form1 : Form

{

double a, b, eps;

double S, en;

int n;

public Form1()

{

InitializeComponent();

textBox1.Text = "0";

textBox2.Text = "5";

textBox3.Text = "0,001";

listBox1.SelectedIndex = 0;

}

private void InpData(out double a, out double b,

out double eps)

{

a = Convert.ToDouble(textBox1.Text);

b = Convert.ToDouble(textBox2.Text);

eps = Convert.ToDouble(textBox3.Text);

}

private double Fy(double x)

{

double y = 0;

switch (listBox1.SelectedIndex)

{

case 0: y = Math.Sin(x); break;

case 1: y = Math.Cos(x); break;

case 2: y = Math.Exp(x); break;

case 3: y = Math.Exp(-x * x / 2); break;

case 4: if (x != 0) y = Math.Sin(x) / x;

else y = 1; break;

case 5: y = Math.Sin(x) * x; break;

}

return y;

}

private void CalcIntegral(double a, double b, double eps,

out double S, out double en, out int n)

{

int nmax = 50000;

double Sp, x, y, dx; //

S = 0;

en = 2 * eps;

n = 10;

while ((en>eps) && (n<nmax))

{

Sp=S;

S=0;

n=2*n;

dx=(b-a)/n;

x=a;

for (int i=1; i<=n; i++)

{

y = Fy(x);

S=S+y;

x=x+dx;

}

S=S*dx;

en=Math.Abs(S-Sp);

}

}

private void OutResult(double a, double b, double eps,

double S, double en, double n)

{

textBox4.AppendText(string.Format

(" Інтеграл від функції {0} в межах від {1} до {2}"

+ " із заданою допустимою похибкою {3} обчислений "

+ " з такими результатами: значення інтеграла {4:f5} ,"

+ " похибка {5:f5}, кількість елементарних інтервалів {6}\n",

listBox1.SelectedItem, a, b, eps, S, en, n));

}

private void button1_Click(object sender, EventArgs e)

{

try

{

InpData(out a, out b, out eps);

}

catch

{

MessageBox.Show("Помилка запису числа", "Увага!");

return;

}

CalcIntegral(a, b, eps, out S, out en, out n);

OutResult(a, b, eps, S, en, n);

}

}

}

Основна обчислювально-керуюча процедура Button1_Click викликає зовнішні по відношенню до неї методи InpData, CalcIntegral, OutResult. У цій програмі для створення списку функцій скористаємось компонентом ListBox. Список функцій ;;;;;; запишемо як значення властивості Items компонента ListBox, скориставшись редактором цієї властивості, який викликається кнопкою з трьома крапками в полі значення властивості. Пошук і обчислення вибраної користувачем функції реалізований оператором вибору switch в функції Fy однієї змінноїх. Процедура CalcIntegral написана у повній відповідності до схеми алгоритму на рис. 5.2.

Риc. 5.2 Схема алгоритму процедури обчислення інтегралу