Апроксимація

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

<0>

Міністерство загальної та професійної освіти Російської Федерації


Московський державний будівельний університет


Кафедра інформатики та прикладної математики


КУРСОВА РОБОТА ПО ІНФОРМАТИЦІ

на теми:

  1. Апроксимація.

  2. Розробка модуля виключення нуль-рівнянь в комплексі "Рішення задачі лінійного програмування".


Виконав студент ЕОУС - I - 2: Моносов А. Л.

Викладач: доцент Марьям А. Г.


Москва 1999.

Зміст.


I. Математична частина. Назва ... ... ... ... ... ... ... ... ... ... ... ... ... 3.

1.1 Постановка завдання ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .3.

2.1 Виклад методу ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .4.

3.1 Блок-схема алгоритму. Опис вихідних даних і результатів ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 5.

4.1 Лістинг програми, вихідних даних і результатів ... ... ... ... ... 6.

5.1 Список змінних основної програми ... ... ... ... ... ... ... ... ... 10.

6.1 Заголовки процедур і функцій. Список їх змінних ... ... ... .10.

7.1 Ручний розрахунок ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. 11.

8.1 Обговорення результатів з метою доказу правильності алгоритму і програми ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. 12.

9.1 Висновки ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .13.

II. Економічна частина. Назва ... ... ... ... ... ... ... ... ... ... ... ... .. 14.

1.2 Постановка задачі лінійного програмування та завдання на розробку модуля ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 14.

2.2 Опис вихідних даних і результатів вирішення завдань лінійного програмування ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 18.

3.2 Опис модуля типів ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. 19.

4.2 Укрупненная блок-схема задачі лінійного програмування .. 20.

5.2 Параметри і заголовки процедур завдання лінійного програмування ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. 21.

6.2 Блок-схема і параметри реалізованої процедури ... ... ... ... ... 21.

7.2 Лістинг модуля, вихідних даних і результатів машинного розрахунку ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .23.

8.2 Ручний розрахунок задачі лінійного програмування ... ... ... ... ... 24.

9.2 Висновки ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .26.

Список використаної літератури. ... ... ... ... ... ... ... ... ... ... ... .. 27.


  1. Математична частина. Апроксимація.


    1. Постановка завдання.


Нехай величина y є функцією аргументу x. Це означає, що будь-якому значенню x з області визначення поставлено відповідно значення y. Разом з тим на практиці часто невідома явний зв'язок між y і x, тобто неможливо записати цей зв'язок у вигляді y = f (x). У деяких випадках навіть при відомій залежності y = f (x) вона настільки громіздка (наприклад, містить важко обчислювані вирази, складні інтеграли і т.п.), що її використання в практичних розрахунках важко.

Найбільш поширеним і практично важливим випадком, коли вид зв'язку між параметрами x і y невідомий, є завдання цієї зв'язку у вигляді деякої таблиці {x i y i}. Це означає, що дискретного безлічі значень аргументу {x i} поставлено у відповідність безліч значень функції {y i} (i = 0,1 ... n). Ці значення - або результати розрахунків, або експериментальні дані. На практиці нам можуть знадобитися значення величини y і в інших точках, відмінних від вузлів x i. Однак отримати ці значення можна лише шляхом дуже складних розрахунків або провидінням дорогих експериментів.

Таким чином, з точки зору економії часу і коштів ми приходимо до необхідності використання наявних табличних даних для наближеного обчислення шуканого параметра y при будь-якому значенні (з деякої області) визначального параметра x, оскільки точний зв'язок y = f (x) невідома.

Цій меті і служить завдання про наближення (апроксимації) функцій: цю функцію f (x) потрібно наближено замінити (апроксимувати) деякою функцією g (x) так, щоб відхилення (в певному сенсі) g (x) від f (x) в заданій області було мінімальним. Функція g (x) при цьому називається апроксимуючої.

Для практики дуже важливий випадок апроксимації функції многочленом:


g (x) = a 0 + a 1 x + a 2 x 2 + ... + a m x m (2.1)


При цьому коефіцієнти a j будуть підбиратися так, щоб досягти найменшого відхилення многочлена від даної функції.

Якщо наближення будуватися на заданій множині точок {xi}, то апроксимація називається точковою. До неї відносяться інтерполювання, середньоквадратичне наближення та ін При побудові наближення на безперервному безлічі точок (наприклад, на відрізку [a, b] апроксимація називається безперервної або інтегральної).


2.1 Виклад методу (Точкова апроксимація).


Одним з основних типів точкової апроксимації є інтерполювання. Воно полягає в наступному: для даної функції y = f (x) будуємо многочлен (2.1), що приймає в заданих точках x i ті ж значення y i, що і функція f (x), тобто g (x i) = y i, i = 0,1, ... n.

При цьому передбачається, що серед значень x i немає однакових, тобто x i  x k при цьому i  k. Точки x i називаються вузлами інтерполяції, а многочлен g (x) - інтерполяційним многочленом.


Y









X


X 0 X 1. . . X n



Рис. 1


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

Максимальний ступінь інтерполяційного многочлена m = n; в цьому випадку говорять про глобальну інтерполяції.

При великій кількості вузлів інтерполяції виходить висока ступінь многочлена (2.1) у разі глобальної інтерполяції, тобто коли потрібно вміти один інтерполяційний многочлен для всього інтервалу зміни аргументу. Крім того, табличні дані могли бути отримані шляхом вимірів і містити помилки. Побудова аппроксіміруемого многочлена з умовою обов'язкового проходження його графіка через ці експериментальні точки означало б ретельне повторення допущених при вимірах помилок. Вихід з цього становища може бути знайдений вибором такого многочлена, графік якого проходить близько від даних точок (рис.1, штрихова лінія).

Одним з таких видів є середньоквадратичне наближення функції за допомогою многочлена (2.1). При цьому m  n; випадок m = n відповідає інтерполяції. На практиці намагаються підібрати апроксимуючої многочлен якомога меншою мірою (як правило, m = 1, 2, 3).

Мірою відхилення многочлена g (x) від заданої функції f (x) на множині точок (x i, y i) (i = 0,1, ..., n) при среднеквадратичном наближенні є величина S, що дорівнює сумі квадратів різниці між значеннями многочлена і функції в даних точках:

n

S =  [g (x i)-y i] 2

i = 0


Для побудови апроксимуючих многочлена потрібно підібрати коефіцієнти a 0, a 1, ..., a m так, щоб величина S була найменшою. У цьому полягає метод найменших квадратів.


n

dS / da 1 = 2  [g (x i)-y i] 2 * 1 = 0;

i = 1

n

dS / da 2 = 2  [g (x i)-y i] 2 * x i = 0;

i = 1


...


n

dS / da m +1 = 2  [g (x i)-y i] 2 * x i m = 0.

i = 1


C AB

n

 x i

...

 x i m


a 1


 y i

=

 x i

 x i 2

...

 x i m +1


a 2


 y i x i

... ... ... ... ... ...
...
...

 x i m

 x i m +1

...

 x i 2m


a m +1


 y i x i m


3.1 Блок-схема алгоритму. Опис вихідних даних і результатів.




i = 1


i = n

j = 1




Розрахунок першого рядка матриці С і вектора В


i = 1


i = n



i = 1


i = n


j = m +1


i = 1


j = 1


j = m



Розрахунок інших рядків матриці С


j = 1



j = n


j = 1

j = n



i = m





i = 1



j = m +1


крок =- 1



j = 1



i = n







Вихідні дані, а саме:

m-число вузлів апроксимації.

n - ступінь апроксимує многочлена.

X - вектор вузлів апроксимації.

Y - вектор значень аппроксіміруемой функції.

Всі ці значення ми заносимо в файл jan.dat, який працює тільки на читання і файлової змінної є f1.

Результати:

Всі результати виводяться у файл jan.res, що працює на запис і має файлову змінну f2.

Спочатку в цей файл виводяться вихідні дані, які беруться з файлу jan.dat, але при цьому вже з описом, тобто не просто числа, а скоментаріем, що вони означають.

Потім виводяться результати обчислення, проведеної машиною, при цьому всі результати відформатовані:

Виводиться матриця З системи лінійних рівнянь для апроксимації разом з вектором правих частин. Потім виводиться рішення цієї системи рівнянь, що є вектором коефіцієнтів апроксимуючих многочлена за зростанням ступеня. І в кінці виводиться вектор похибки апроксимації Z.


4.1 Лістинг програми, вихідних даних і результатів.


program approx;

uses crt, gausstpu;

const nm = 20;

type vect1 = array [1 .. nm] of real;

var c: matr;

a, b: vect;

x, y, z: vect1;

n, i, j, m: integer;

f1, f2: text;

procedure Create_BC (n, m: integer; var x, y: vect1; var c: matr; var b: vect);

var i, j: integer;

r: vect;

begin

for i: = 1 to n do

r [i]: = 1;

for j: = 1 to m +1 do begin

c [1, j]: = 0;

b [j]: = 0;

for i: = 1 to n do begin

c [1, j]: = c [1, j] + r [i];

b [j]: = b [j] + r [i] * y [i];

end;

for i: = 1 to n do

r [i]: = r [i] * x [i];

end;

for i: = 1 to m do begin

for j: = 1 to m do

c [i +1, j]: = c [1, j +1];

c [i +1, m +1]: = 0;

for j: = 1 to n do

c [i +1, m +1]: = c [i +1, m +1] + r [j];

for j: = 1 to n do

r [j]: = r [j] * x [j];

end; end;

begin

assign (f1, 'jan.dat'); reset (f1);

assign (f2, 'jan.res'); rewrite (f2);

readln (f1, n); writeln (f2, 'Кількість вузлів апроксимації n =', n: 3);

readln (f1, m); writeln (f2, 'Ступінь многочлена m =', m: 2);

writeln (f2, 'Вектор вузлів апроксимації x [i]');

for i: = 1 to n do begin

read (f1, x [i]);

write (f2, x [i]: 4:2, '');

end;

writeln (f2);

writeln (f2, 'Вектор значень аппроксіміруемой функції y [i]');

for i: = 1 to n do begin

read (f1, y [i]);

write (f2, y [i]: 4:2, '');

end;

Create_BC (n, m, x, y, c, b);

writeln (f2);

writeln (f2, 'Матриця системи лінійних рівнянь для апроксимації і вектор правих частин);

for i: = 1 to m +1 do begin

for j: = 1 to m +1 do

write (f2, c [i, j]: 8:1); writeln (f2, b [i]: 8:1); end;

gauss (m +1, c, b, a);

for i: = 1 to n do begin

z [i]: = 0;

for j: = m +1 downto 1 do

z [i]: = z [i] * x [i] + a [j];

z [i]: = z [i]-y [i]; end;

writeln (f2);

writeln (f2, 'Вектор коефіцієнтів апроксимуючих многочлена за зростанням);

writeln (f2, 'ступеня (m +1 елементів)');

for i: = 1 to m +1 do

writeln (f2, 'a [', i: 1 ,']=', a [i]: 6:2);

writeln (f2, 'Вектор похибки апроксимації у вузлах X);

for i: = 1 to n do

writeln (f2, 'z [', i: 1 ,']=', z [i]: 5:3);

close (f1); close (f2);

end.


Вихідний файл jan.dat:


10

2

1 6 0 3 8 2 12 9 2 5

9 4 13 7 3 9 3 1 4 2


Файл результатів jan.res:


Число вузлів апроксимації n = 10

Ступінь многочлена m = 2

Вектор вузлів апроксимації x [i]

1.00 6.00 0.00 3.00 8.00 2.00 12.00 9.00 2.00 5.00

Вектор значень аппроксіміруемой функції y [i]

9.00 4.00 13.00 7.00 3.00 9.00 3.00 1.00 4.00 2.00

Матриця системи лінійних рівнянь для апроксимації і вектор правих частин

10.0 48.0 368.0 55.0

48.0 368.0 3354.0 159.0

368.0 3354.0 33428.0 1023.0

Вектор коефіцієнтів апроксимуючих многочлена за зростанням ступеня (m +1 елементів)

a [1] = 11.66

a [2] = -2.31

a [3] = 0.13

Вектор похибки апроксимації у вузлах X

z [1] = 0.479

z [2] =- 1.381

z [3] =- 1.343

z [4] =- 1.070

z [5] =- 1.247

z [6] =- 1.430

z [7] =- 0.244

z [8] = 0.723

z [9] = 3.570

z [10] = 1.454


5.1 Список змінних основної програми.


В основній програмі використовуються розділ констант і типів:


const nm = 20;

type vect1 = array [1 .. nm] of real;


Наступні змінні так само використовуються в програмі, які описуються в розділі var:


Мінлива

Тип змінної

Опис змінної

З

matr

Матриця системи лінійних рівнянь для апроксимації

А

vect

Вектор коефіцієнтів апроксимуючих многочлена за зростанням ступеня (m +1 елементів)

Х

vect1

Вектор вузлів апроксимації

B

vect

Вектор правих частин

Y

vect1

Вектор значень апроксимуючої функції

Z

vect

Вектор похибки апроксимації у вузлах Х

n

integer

Число вузлів апроксимації

m

integer

Ступінь многочлена

i

integer

Необхідна для нумерації елементів масивів.

j

integer

Необхідна для нумерації елементів масивів.

f1

text

Файлова змінна для файлу вихідних значень

f2

text

Файлова змінна резуртірующего файлу


6.1 Заголовки процедур і функцій. Список їх змінних.


У своїй програмі я використовував наступні модулі, які описуються в операторі uses і процедури:

Crt - стандартний модуль підключення екрану і клавіатури для роботи з програмою.

Gauss - процедура вирішення системи лінійних рівнянь методом Гауса. Вона береться з модуля Gausstpu, де інтерфейсна частина має вигляд:


Interface

Const nmax = 20

Type

Тому при оголошенні матриці С посилатися треба на matr, а векторів A і B на vect.

Create_BC - процедура розрахунку матриці С (С - матриця системи лінійних рівнянь для апроксимації). Тема цієї процедури виглядає так:


procedure Create_BC (n, m: integer; var x, y: vect1; var c: matr; var b: vect);

var i, j: integer;

r: vect;


А ось такі змінні використовуються тільки в цій процедурі, решта засилають з основної програми:


Мінлива

Тип змінної

Опис змінної

i

integer

Використовуються в циклах для перебору чисельних значень

j

integer

Використовуються в циклах для перебору чисельних значень

R

vect

Робочий вектор


7.1 Ручний рахунок.


Складаємо матрицю системи рівнянь за наступним принципом:


n

 x i

 x i 2

 y i

 x i

 x i 2

 x i 3

 x i y i

 x i 2

 x i 3

 x i 4

 x i 2 y i


Для цього обчислюємо необхідні значення:


n = 10;

 x i = 1 +6 +0 +3 +8 +2 +12 +9 +2 +5 = 48;

 x i 2 = 1 2 +6 2 +0 2 +3 2 +8 2 +2 2 +12 2 +9 2 +2 2 +5 2 = 368;

 y i = 9 +4 +13 +7 +3 +9 +3 +1 +4 +2 = 55;

 x i 3 = 1 3 +6 3 +0 3 +3 3 +8 3 +2 3 +12 3 +9 3 +2 3 +5 3 = 3354;

 x i y i = 1 * 9 +6 * 4 +0 * 13 +3 * 7 +8 * 3 +2 * 9 +12 * 3 +9 * 1 +2 * 4 +5 * 2 ​​= 159;

 x i 3 = 1 4 +6 4 +0 4 +3 4 +8 4 +2 4 +12 4 +9 4 +2 4 +5 4 = 33428;

 x i 2 y i = 1 2 * 9 +6 2 * 4 +0 2 * 13 +3 2 * 7 +8 2 * 3 +2 2 * 9 +12 2 * 3 +9 2 * 1 +2 2 * 4 +5 2 * 2 = 1023.


Виходить наступна матриця:


10

48

368

55

48

368

3354

159

368

3354

33428

1023


Яка еквівалентна такій системі рівнянь:

{


10a 1 + 48a 2 + 368a 3 = 55

48a 1 + 368a 2 + 3354a 3 = 159

368a 1 + 3354a 2 + 33428a 3 = 1023


Ми вирішуємо цю систему рівнянь методом Гауса:


10

48

368

55

0

137,6

1587,6

-105

0

1587,6

19885,6

-1001


10

48

368

55

0

137,6

1587,6

-105

0

0

1568,203488

210.4680233


Отримуємо спрощену систему рівнянь:

{


1568,203488 a 3 = +210,4680233

137,6 a 2 + 1587,6 a 3 = -105

10a 1 + 48a 2 + 368a 3 = 55


Вирішуючи яку отримуємо наступні остаточні значення, що є відповіддю:

{


a 3 = 210,4680233 / 1568,203488 = 0,134209638

a 2 = (-105-1587,6 a 3) / 137,6 =- 2,311564115

a 1 = (55-48a 2-368a 3) / 10 = 11,65659307


8.1 Обговорення результатів з метою доказу правильності алгоритму і програми.


Отримані результати показують, що алгоритм і програма складено вірно, тому що значення отримані при ручному рахунку близькі до машинних обчисленням.


9.1 Висновки.


Дана програма дуже ефективна, тому що машина виконує всі дії набагато швидше, ніж людина при ручному рахунку. Так само під час ручного рахунку можуть проізоіті помилки, що призведе до повторного перещітиванію, а у машини, при правильному алгоритмі, таких збоїв не буває (якщо тільки "зависає"). Отже ця програма багато в чому полегшує життя людині.














































  1. Економічна частина. Розробка модуля виключення нуль-рівнянь в комплексі "Рішення задачі лінійного програмування".


1.2 Постановка задачі лінійного програмування та завдання на розробку модуля.


Розглянемо задачу оптимального планування виробництва [1]. Нехай підприємство випускає n виробів, для виробництва яких використовується m інгредієнтів. Інгредієнти це - деталі певного сортаменту, верстати, працівники, електроенергія і т.д., інакше кажучи, все що потрібно для здійснення виробничого циклу. Запаси інгредієнтів задаються вектором b = (b 1, b 2, ..., b m), де b i - запас i-го інгрідієнта (i = 1, ..., m). Задано матриця А, елемент якої a ij визначає витрату i-го інгрідієнта для виробництва одиниці j-го виробу (i = 1, ..., m; j = 1, ..., n). Крім того, задано вектор ринкових цін виробів p = (p 1, p 2, ..., p n), де p - ціна j-го виробу (j = 1, ..., n).

Потрібно скласти такий план виробництва х = (х 1, х 2, ..., х n), щоб при виконання умов


a 11 x 1 + a 12 x 2 + ... + a 1n x n  b 1

(1)

a 21 x 1 + a 22 x 2 + ... + a 2n x n  b 2

... ... ... ... ... ... ... ... ... ... .... ... ... ... ... ... ... ... ....

a m1 x 1 + a m2 x 2 + ... + a mn x n  b m

x j  0, (j = 1, ..., n).


досягався максимум функції

(1 ')


Z = p 1 x 1 + p 2 x 2 + ... + p n x n


Функція Z називається цільовий.

i-е обмеження з (1) означає, що не можна витратити i-го інгредієнта більше, ніж є в наявності. Обмеження (1) задають безліч . Змінні, що задовольняють умові x j  0, називаються невільними. У нашій задачі це означає, що при x j = 0 - нічого не виробляється або при x j> 0 виробляється певна кількість виробів.

Змінні, на які умови неотрицательности не накладаються, називаються вільними.

Задача (1) - (1 ') і є завдання оптимального виробничого планування, вирішення якої забезпечує досягнення в конкретних умовах максимального прибутку.

Сформулюємо двоїсту до (1) - (1 ') завдання про придбанні інгридієнтів за мінімальною ринковою вартістю. Хай те ж саме підприємство, що і в задачі (1) - (1 '), збирається придбати на ринку m інгридієнтів для виробництва тих же n виробів. При цьому кількість придбаних інгридієнтів визначається вектором b = (b 1, b 2, ..., b m). Задано та ж матриця А, елемент якої aij визначає витрату i-го інгрідієнта для виробництва j-го виробу. Крім того задано вектор цін p = (p 1, p 2, ..., p n) на продукцію підприємства. Потрібно відшукати вектор цін інгридієнтів u = (u 1, u 2, ..., u m), де u i - ціна одиниці i-го інгрідієнта (i = 1, ..., m), щоб виконувалися умови:


a 11 u 1 + a 21 u 2 + ... + a m1 u m  p 1

(2)

a 12 u 1 + a 22 u 2 + ... + a m2 u m  p 2

... ... ... ... ... ... ... ... ... ... .... ... ... ... ... ... ... ... ....

a 1n u 1 + a 2n u 2 + ... + a mn u m  p n

u i  0, (i = 1, ..., m)


при досягненні мінімуму цільової функції

(2 ')


W = b 1 u 1 + ... + b m u m


j-е умова (2) означає, що вартість усіх інгредієнтів, що йдуть на виробництво j-го виробу, не менше ринкової ціни цього виробу.

Умова невільною u j  0 означає, що j-й інгредієнт або безкоштовний (u j = 0), або коштує позитивний кількість рублів (u j> 0).

Опорним рішенням задачі (1) - (1 ') називається точка безлічі , в якому не менш ніж n обмежень з (1) звертається у вірне рівність. Це - так звана, кутова точка множини. Для n = 2 це - вершина плоского кута.

Опорним рішенням задачі (2) - (2 ') називається точка, в якій не менше ніж m обмежень з (2) звертається у вірне рівність.

У задачі (1) - (1 ') опорне рішення - точка х = (0, ..., 0), початок координат. У задачі (2) - (2 ') початок координат - точка u = (0, ..., 0), опорним рішенням не є.

Опорне рішення, що доставляє максимум функції (1 ') або мінімум функції (2') називається оптимальним. У роботі [1] показано, що оптимальне рішення можна завжди шукати серед опорних рішень.

Серед лінійних обмежень задачі (1) - (1 ') крім нерівностей можуть бути і рівності. Тоді домовимося писати ці рівності першими. Якщо їх кількість дорівнює k, то область  запишеться у вигляді:


a 11 x 1 + a 12 x 2 + ... + a 1n x n = b 1

... ... ... ... ... ... ... ... ... ... .... ... ... ... ... ... ... ... ... ...

(3)

a k1 x 1 + a k2 x 2 + ... + a kn x n = b k

a k +1, 1 x 1 + a k +1, 2 x 2 + ... + a k +1, n x n  b k +1

... ... ... ... ... ... ... ... ... ... .... ... ... ... ... ... ... ... ... ...

a m1 x 1 + a m2 x 2 + ... + a mn x n  b m

x j  0, (j = 1, ..., n)


Потрібно знайти максимум функції

(3 ')


Z = p 1 x 1 + p 2 x 2 + ... + p n x n


У загальному випадку серед змінних x j можуть бути вільні. Номери вільних змінних будемо зберігати в окремому масиві.

При формуванні двоїстої задачі до задачі (3) - (3 ') i-му обмеження - рівності буде відповідати вільна мінлива u i (i = 1, ..., k), а вільної змінної x j обмеження - рівність:

a 1j u 1 + a 2j u 2 + ... + a mj u m = p j

Введемо допоміжні змінні y i  0 (i = 1, ..., n) і запишемо обмеження (3) і функцію Z у вигляді:


0 = a 11 (-x 1) + a 12 (-x 2) + ... + a 1n (-x n) + a 1, n +1

... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...

(4)

0 = a k1 (-x 1) + a k2 (-x 2) + ... + a kn (-x n) + a k, n +1

y k +1 = a k +1, 1 (-x 1) + a k +1, 2 (-x 2) + ... + a k +1, n (-x n) + a k +1, n + 1

... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...

y m = a m1 (-x 1) + a m2 (-x 2) + ... + a mn (-x n) + a m, n +1

Z = A m +1, 1 (-x 1) + a m +1, 2 (-x 2) + ... + a m +1, n (-x n) + a m +1, n +1


Умова невільною окремих або всіх змінних тут не відзначено. Позначення:


a i, n +1 = b i (i = 1, ..., m),

a m +1, j =-p j (j = 1, ..., n)

a m +1, n +1 = 0.


Таким чином, матрицю а ми доповнили стовпцем вільних членів, а також рядок коефіцієнтів цільової функції, змінивши знаки цих коефіцієнтів на протилежні. Тоді завдання (4) можна представити у вигляді таблиці. 1:


Пряма задача Таблиця 1


-X 1

-X 2


-X n

1

0 =

a 11

a 12

...

a 1n

a 1, n +1

... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...

0 =

..

a k, n +1

y k +1 =

a k1

a k2

...

a kn

a k +1, n +1

... ...

a k +1, 1

a k +1, 2

...

a k +1, n

... ... ...

y m =

... ... ... ... ... ... ... ... ... ... ... ... ... ...

a m1

a m2

...

a mn

a m, n +1

Z =

a m +1, n

a m +1, 2

...

a m +1, n

a m +1, n +1


Номери вільних змінних запам'ятовуються окремо.

Сумісний таблицю двоїстої задачі з таблицею. 1 і отримаємо таблицю. 2.


Пряма і двоїста задачі Таблиця 2



v 1 =

v 2 =


v n =

W =



-X 1

-X 2


-X n

1

u 1

0 =

a 11

a 12

...

a 1n

a 1, n +1


... ...

... ... ... ... ... ... ... ... ... ... ... ...

... ... ...

u k

0 =

a k1

a k2

...

a kn

a k, n +1

u k +1

y k +1 =

a k +1, 1

a k +1, 2

...

a k +1, n

a k +1, n +1


... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...

u m

y m =

a m1

a m2

...

a mn

a m, n +1

1

Z =

a m +1, n

a m +1, 2

...

a m +1, n

a m +1, n +1


v j - допоміжні змінні двоїстої задачі.

Тоді j-е обмеження з таблиці має вигляд:


v j = a 1j u 1 + a 2j u 2 + ... + a mj u m + a m +1, j  0, якщо x j  0


Якщо змінна x j вільна, то їй відповідає обмеження-рівність двоїстої задачі:


0 = a 1j u 1 + a 2j u 2 + ... + a mj u m + a m +1, j


тобто замість v j фактично буде нуль.

Крім того перший k змінних двоїстої задачі вільні, а інші невільні.

Цільова функція двоїстої задачі


W = a 1, n +1 u 1 + a 2, n +1 u 2 + ... + a m, n +1 u m + a m +1, n +1


Поєднання в одній таблиці прямий і двоїстої задачі невипадково. Вирішуючи пряму задачу, ми отримуємо про дновременно рішення двоїстої задачі, причому


max Z = min W = a m +1, n +1


Зробимо заміну змінних в таблиці 1, перекинувши допоміжну змінну y r на верх таблиці зі знаком мінус, а основну мінно x s на бік таблиці (a rs  0). Це означає рух з вершини x = (0, ..., 0) в іншу вершину багатогранника  за його ребру. Елемент а rs називається що дозволяє, рядок r - роздільної рядком, стовпець s - дозволяючим стовпцем. Така заміна змінних носить назву модифікованих Жорданових винятків (Мжі). Елементи матриці а, не належать дозволяючим стовпцю чи дозволяє рядку, назвемо рядовими.


2.2 Опис вихідних даних і результатів рішення задачі лінійного програмування.


Обговоримо вихідні дані (текстовий файл simp.dat) та результати виконання завдання лінійного програмування (текстовий файл simp.res). На початку файлу simp.dat розташовані, так звані, представницькі дані - строкові дані, кожне з яких розташований у файлі з нового рядка:

1. Рядок з номером варіанту,

2. Рядок з російською назвою модуля,

3. Рядок з координатами студента (ПІБ, факультет, курс, група),

4. Рядок з датою виконання.

Далі йдуть рядки файлу з числовими вихідними даними:

1. Керуючий вектор kl - окремий рядок складається з трьох чисел kl 1, kl 2, kl 3:

kl 1 = 0, якщо необхідно отримати рішення тільки прямої задачі.

kl 1 = 1, якщо необхідно отримати рішення тільки двоїстої задачі.

kl 1 = 2, якщо необхідно отримати рішення обох задач.

kl 2 = 0, якщо немає вільних змінних, інакше kl 2 дорівнює числу цих нуль-рівнянь.

2. Число обмежень і змінних (окремий рядок введення).

3. Коефіцієнти розширеної матриці a, починаючи з окремого рядка введення.

4. Вектор номерів вільних змінних, якщо вони є, починаючи з окремого рядка введення.

Результати рішення залежать від значення kl.

Якщо kl 1 = 0, то при успішному результаті це буде вектор оптимального рішення прямої задачі і оптимальне значення цільової функції. При несприятливому результаті, це одне з повідомлень: або "Система обмежень несовместна", або "Цільова функція необмежена".

Якщо kl 2 = 1, то ж для двоїстої задачі.

Якщо kl 2 = 2, то спочатку видається рішення прямій, а потім двоїстої задачі. При не успішному результаті повідомлення справедливі тільки для прямої задачі (для двоїстої аналогічні повідомлення не видаються). Результати поміщаються у файл simp.res.

3.2 Опис модуля типів.


Для завдання типів і файлових змінних вступного та вивідного текстових файлів використовується модуль типів unit typesm, структура якого наведена нижче


unit typesm;

interface

const

mmax = 20; nmax = 20; e = 1e-5;

type

klt = array [1 .. 3] of integer;

at = array [1 .. mmax +1,1 .. nmax +1] of real;

vec1it = array [1 .. nmax] of integer;

vec2it = array [1 .. mmax] of integer;

vec1rt = array [1 .. nmax] of real;

vec2rt = array [1 .. mmax] of real;

var

fi, fo: text;

implementation

end.


У розділі констант задані константи nmax і mmax, що задають максимальне число рядків розширеної матриці a без одиниці, а також порогова константа е, використовувана в модулі пошуку роздільної рядка. Константа ий використовується для забезпечення стійкості алгоритму (модуль дозволяє елемента не повинен бути занадто малий, а саме, більше е).

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


N / N

Призначення

Позначення

Тип

1.

Керуючий вектор

k1

ki1t

2.

Число обмежень

m

integer

3.

Число змінних

n

integer

4.

Матриця коефіцієнтів

a

at

5.

Вектор номерів вільних змінних

i1

vec1it

6.

Відслідковує вектор основних змінних прямої задачі

p1

vec1it

7.

Відслідковує вектор допоміжних змінних двоїстої задачі

q1

vec1it

8.

Відслідковує вектор допоміжних змінних прямої задачі

p2

vec2it

9.

Відслідковує вектор основних змінних двоїстої задачі

q2

vec2it

10.

Роздільна рядок

r

integer

11.

Дозволяє стовпець

s

integer

12.

Вектор-рішення прямої задачі

x

vec1rt

13.

Вектор-рішення двоїстої задачі

u

vec2rt


4.2 Укрупненная блок-схема задачі лінійного програмування.


5.2 Параметри і заголовки процедур завдання лінійного програмування.


В основній програмі використовуються наступні змінні, які описані в розділі var:


m, n, r, s: integer; {числові змінні цілого типу}


Процедури програми:


N / N

Призначення

Тема

1.

Введення і контроль вихідних даних і виведення їх у файл результатів

input (var k1: k1t; var m, n: integer; var a: at, var i1: vec1it; var p1, q1: vec1it; var p2, q2: vec2it)

2.

Виняток вільних змінних

issp (var k1: k1t; m, n: integer; var a: at; var i1, p1, q1: vec1it; var p2, q2: vec2it)

3.

Виняток нуль-рівнянь

isnu (var k1: k1t; m, n: integer; var a: at; var p1, q1: vec1it; var p2, q2: vec2it)

4.

Пошук опорного рішення

opor (m, n: integer; var a: at; var p1, q1: vec1it; var p2, q2: vec2it)

5.

Пошук оптимального рішення

optim (m, n: integer; var a: at; var p1, q1: vec1it; var p2, q2: vec2it)

6.

Висновок рішення прямої задачі

outp (m, n: integer; var a: at; var p2: vec2it; x: vec1rt)

7.

Висновок рішення двоїстої задачі

outd (m, n: integer; var a: at; var q1: vec1it; u: vec2rt)

8.

Мжі

mji (m, n: integer; var a: at; r, s: integer)

9.

Пошук роздільної рядки

nstro (m, n: integer; var a: at; r, s: integer var p2: vec2it)


6.2 Блок-схема і параметри реалізованої процедури.

r = 1


та

немає


p2 r <0

p1 (| p2 r |) =- 1


P = 0



p1 j> 0

j = 1

немає


та



немає


| A rj |> p


та



p = | a rj | s = j



j = n


та


P = 0



немає


"Викл. R-е нуль-ур. Не можна"


MJI (m, n, a, r, s)



p2 r = p1 s p1 s =- 1

t = q2 r q2 r = q1 s q1 s = t


Закрити файли




До



r = k



B



Обращащеніе: isnu (k1, m, n, a, p1, q1, p2, q2). Використовуються модулі typesm, mjim.

Параметри підпрограми isnu:


Найменування

Позначення

Число обмежень

m

Число змінних

n

Матриця завдання

a

Відстежують вектори

p1, q1, p2, q2


У результаті успішної роботи алгоритму всі нуль-рівняння будуть виключені, і в відстежує векторі p1 це буде відзначено як -1, що дасть можливість у подальшому відповідні стовпці матриці А при виборі дозволяє елемента не чіпати. Якщо ж алгоритм застосувати не можна, то буде видане повідомлення (див. блок-схему), і робота програми закінчиться.

7.2 Лістинг модуля, вихідних даних і результатів машинного розрахунку.


unit isnum;

interface

uses typesm, mjim;

procedure isnu (var k1: k1t; m, n: integer; var a: at;

var p1, q1: vec1it; var p2, q2: vec2it);

implementation

procedure isnu;

var p: real; k, s, r, j, t: integer;

begin

for r: = 1 to k do begin

if p2 [r] <0 then p1 [abs (p2 [r ])]:=- 1; end;

p: = 0;

for j: = 1 to n do begin

if p1 [j]> 0 then begin

if abs (a [r, j])> p then begin p: = abs (a [r, j]); s: = j; end;

end; end;

if p = 0 then begin writeln (fo, 'Виключити r', r: 6, '-е нуль-рівняння не можна');

close (fi); close (fo); halt end;

mji (m, n, a, r, s);

p2 [r]: = p1 [s]; p1 [s]: =- 1;

t: = q2 [r]; q2 [r]: = q1 [s]; q1 [s]: = t;

end;

end.


Вихідний файл simp.dat:


12

Виняток нуль-рівнянь

Моносов ЕОУС-1-2 викладач Марьям А. Г.

12.05.98

2 2 0

5 Березня

-2 -1 1 -2

1 -1 0 -1

-1 -1 0 -2

0 1 0 2

2 1 0 4

4 4 0 0

2 Січень


Файл результатів simp.res:


МОСКОВСЬКИЙ державний технічний університет

КАФЕДРА ІНФОРМАТИКИ І ПРИКЛАДНОЇ МАТЕМАТИКИ

Лабораторна робота з інформатики

Факультет ЕОУС, 2-ий семестр навчання

Рішення задачі лінійного програмування

Варіант 12

модуль: Виключення нуль-рівнянь

Виконав студент Моносов ЕОУС-1-2 викладач Марьям А. Г.

Дата виконання: 12.05.98

Керуючий вектор:

2 2 0

Число обмежень: 5

Число змінних: 3

Матриця завдання

Н-р Коефіцієнти Св. члени

рядки

1 -2.00000 -1.00000 1.00000 -2.00000

2 1.00000 -1.00000 0.00000 -1.00000

3 -1.00000 -1.00000 0.00000 -2.00000

4 0.00000 1.00000 0.00000 2.00000

5 2.00000 1.00000 0.00000 4.00000

6 4.00000 4.00000 0.00000 0.00000

Вектор номерів вільних змінних:

2 Січень

Вектор рішення прямої задачі:

1.00000 2.00000 3.00000

Значення цільової функції прямої задачі = 12.00000

Вектор рішення двоїстої задачі:

0.00000 4.00000 0.00000 8.00000 0.00000

Значення цільової функції двоїстої задачі = 12.00000


8.2 Ручний розрахунок задачі лінійного програмування.


Потрібно максимізувати функцію


z = 4x 1 +5 x 2


при обмеженнях:


-2x 1-x 2 + x 3 =- 2

x 1-x 2  -1

- X 1 - x 2  -2

0x 1 + 1x 2  2

2x 1 + 1x 2  4

x 3  0


Коефіцієнти обмежень, записаних у такому вигляді, переписуються зі своїми знаками, в останньому рядку таблиці записуються коефіцієнти цільової функції з протилежними знаками. Спершу слід виключити вільні змінні, перекинувши їх на бік таблиці:



-X 1

-X 2

-X 3

1

0 =

-2

-1

1

-2

y 2 =

1

-1

0

-1

y 3 =

-1

-1

0

-2

y 4 =

0

1

0

2

y 5 =

2

1

0

4

z =

-4

-4

0

0



-X 1

-Y 4

-X 3

1

0 =

-2

1

1

0

y 2 =

1

1

0

1

y 3 =

-1

1

0

0

* X 2 =

0

1

0

2

y 5 =

2

-1

0

2

z =

-4

4

0

8



-Y 2

-Y 4

-X 3

1

0 =

-2

3

1

2

* X 1 =

1

1

0

1

y 3 =

-1

2

0

0

* X 2 =

0

1

0

2

y 5 =

2

-3

0

0

z =

4

8

0

12


Після цього слід виключити нуль-рівняння:





*



-Y 2

-Y 4

-Y 1

1

x 3 =

-2

3

1

2

* X 1 =

1

1

0

1

y 3 =

-1

2

0

0

* X 2 =

0

1

0

2

y 5 =

2

-3

0

0

z =

4

8

0

12


Ми бачимо, що вільні члени в непозначених рядках ненегативні, отже опорне рішення отримано і треба перейти до пошуку оптимального рішення. Знаходимо непозначених стовпці з негативними коефіцієнта цільової функції, крім останнього. У нас таких немає, тому оптимальне рішення отримано і переходимо до вилучення результатів. Для цього складемо ще одну таблицю, де міститися змінні прямої і двоїстої задач. Для витягання рішень потрібні лише стовпець вільних членів і рядок коефіцієнтів цільової функції. Тому внутрішня частина таблиці не узгоджено.




u 2 =

u 4 =

u 1 =

w =



-Y 2

-Y 4

-Y 1

1

v 3 =

x 3 =

-2

3

1

2

v 1 =

x 1 =

1

1

0

1

u 3 =

y 3 =

-1

2

0

0

v 2 =

x 2 =

0

1

0

2

u 5 =

y 5 =

2

-3

0

0

1

z =

4

8

0

12


У результаті отримуємо такі результати:


  1. Пряма задача. Змінні прямої задачі, що знаходяться зверху таблиці рівні у вирішенні 0, а збоку - відповідним вільним членам:


x 1 = 1; x 2 = 2; x 3 = 2.


  1. Двоїста задача. Змінні двоїстої задачі, що знаходяться зверху таблиці рівні 0, а збоку - відповідним коефіцієнтом цільової функції:


u 1 = 0; u 2 = 4; u 3 = 0; u 4 = 8; u 5 = 0.


Значення цільових функцій обох задач z max = w min = 12.


9.2 Висновки.


Отримані результати при ручному розрахунку збігаються з даними машинного рахунку. Це підтверджує правильність складання алгоритму і написання програми.

Список використаної літератури.


  • Турчак Л. І. "Основи чисельних методів".

































Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Реферат
91.4кб. | скачати


Схожі роботи:
Апроксимація функцій
Апроксимація функції з використанням нейронних мереж
Апроксимація характеристик нелінійних елементів і аналіз ланцюгів при гармонійних впливах
Різницевий метод розв язування звичайних диференціальних рівнянь Апроксимація Метод прогонки
© Усі права захищені
написати до нас