Программный код Эксперимента № 2




 

function [] = exp2(tM)

if tM==1

disp('Результаты эксперимента с матрицей Гильберта');

exp2_bad_nonfixed(1);

elseif tM==2

disp('Результаты эксперимента с матрицей № 2');

exp2_bad_fixed(2);

elseif tM==3

disp('Результаты эксперимента с матрицей № 3');

exp2_bad_fixed(3);

elseif tM==4

disp('Результаты эксперимента с матрицей № 4');

exp2_bad_nonfixed(4);

elseif tM==5

disp('Результаты эксперимента с матрицей № 5');

exp2_bad_nonfixed(5);

elseif tM==6

disp('Результаты эксперимента с матрицей № 6');

exp2_bad_fixed(6);

elseif tM==7

disp('Результаты эксперимента с матрицей № 7');

exp2_bad_nonfixed(7);

elseif tM==8

disp('Результаты эксперимента с матрицей № 8');

exp2_bad_nonfixed(8);

elseif tM==9

disp('Результаты эксперимента с матрицей № 9');

exp2_bad_nonfixed(9);

elseif tM==10

disp('Результаты эксперимента с матрицей № 10');

exp2_bad_fixed(10);

else disp('Неверный номер матрицы!')

end

 

Вспомогательная функция для вычисления точности обращения:

 

function [norm] = exact_func(A_orig, A_ob, n)

% вычисляем точность обращения

 

Mult = A_orig*A_ob;

Mult=eye(n,n)-Mult;

 

for i=1:n

sum_a = 0;

sum_mult = 0;

for j=1:n

sum_a = sum_a + abs(A_orig(i,j));

sum_mult = sum_mult + abs(Mult(i,j));

end

if (i==1)

max_a = sum_a;

max_mult = sum_mult;

else

if (sum_a > max_a)

max_a = sum_a;

end

if (sum_mult > max_mult)

max_mult = sum_mult;

end

end

end

 

norm = max_mult/max_a;

 

end

 

Функция для эксперимента с матрицами нефиксированного размера:

 

function [] = exp2_bad_nonfixed(tM)

clc();

frmt = get(0,'Format');

frmtV = get(0,'FormatSpacing');

format('shortG')

format('compact')

exp_Data = zeros(1,50);

count=1;

for n=4:4:40

exp_Data(count) = n;

count = count+1;

A=zeros(n,n);

% Матрица Гильберта

if (tM==1)

for i=1:n

for j=1:n

A(i,j)=1.0/(i+j-1);

end

end

end

% Матрица № 4

if (tM==4)

for i=1:n

for j=1:n

if (i==j)

A(i,i) = 0.01/(n-i+1)/(i+1);

elseif (i<j)

A(i,j) = 0;

else

A(i,j) = i*(n-j);

end

end

end

end

% Матрица № 5

if (tM==5)

for i=1:n

for j=1:n

if (i==j)

A(i,i) = 0.01/(n-i+1)/(i+1);

elseif (i<j)

A(i,j) = j*(n-j);

else

A(i,j) = i*(n-j);

end

end

end

end

% Матрица № 7

if (tM==7)

w = 5;

for i=1:n

for j=1:n

if (i==j)

A(i,j) = w^(abs(n-2*j)/2);

elseif ((i==1) || (j==1))

A(i,j) = A(1,1)/w^j;

elseif((i==n) || (j==n))

A(i,j) = A(n,n)/w^j;

end

end

end

end

 

% Матрица № 8

if (tM==8)

h = 0.000001;

for i=1:n

for j=1:n

A(i,j) = exp(i*j*h);

end

end

end

 

% Матрица № 9

if (tM==9)

c = 99999;

for i=1:n

for j=1:n

A(i,j) = c + log2(i*j);

end

end

end

 

x_ex = zeros(n,1);

b_ex = zeros(n,1);

for i=1:n

x_ex(i) = i;

end;

 

% Вычисляем правую вектор b для точного решения

for i=1:n

for j=1:n

b_ex(i) = b_ex(i) + A(i,j) * x_ex(j);

end

end

 

% Засекаем время

tic

[A, p, q, znak, op_numb] = factorization(A, n);

[x_calc,op_numb_2] = SLAE(A, b_ex, n, p, q);

exp_Data(count) = toc;

count = count+1;

 

% Вычисляем точность найденного решения

for i=1:n

ex = abs(x_ex(i) - x_calc(i));

if (i == 1)

max_ex = ex;

else

if (ex > max_ex)

max_ex = ex;

end

end

end

exp_Data(count) = max_ex;

count = count +1;

 

exp_Data(count) = n^3/3;

count = count +1;

 

exp_Data(count) = op_numb + op_numb_2;

count = count + 1;

end

 

dlmwrite('file.dat',exp_Data,';');

clear A;

clear exp_Data;

 

n_ar = zeros(1,10);

time_ar = zeros(1,10);

ex_ar = zeros(1,10);

th_numb_ar = zeros(1,10);

fact_numb_ar = zeros(1,10);

 

read_data = dlmread('file.dat', ';');

count = 1;

 

% Вывод таблицы

disp(' Порядок Время Точность Теоретическое ЧО Реальное ЧО');

for i=1:5:50

n_ar(count) = read_data(i);

time_ar(count) = read_data(i+1);

ex_ar(count) = read_data(i+2);

th_numb_ar(count) = read_data(i+3);

fact_numb_ar(count) = read_data(i+4);

count = count + 1;

str = [round(read_data(i)), read_data(i+1), read_data(i+2), round(read_data(i+3)), round(read_data(i+4))];

disp(str);

end

 

% Вывод графиков

plot(n_ar, time_ar, 'k');

title('Зависимость времени решения от размера матрицы (мск)');

grid on;

figure;

 

plot(n_ar, ex_ar, 'k');

title('Зависимость точности решения от размера матрицы');

grid on;

figure;

 

plot(n_ar, th_numb_ar, n_ar, fact_numb_ar,'--');

title('Теоретическое и реальное количество операций');

grid on;

legend('Теоретич. ЧО','Реальное ЧО',2);

 

format(frmt)

format(frmtV)

end

 

 

Функция для эксперимента с матрицами фиксированного размера:

 

function [] = exp2_bad_fixed(tM)

%clc();

frmt = get(0,'Format');

frmtV = get(0,'FormatSpacing');

format('shortG')

format('compact')

exp_Data = zeros(1,5);

count=1;

% Матрица № 2

if (tM==2)

n=20;

exp_Data(count) = n;

count = count+1;

A = zeros(n,n);

for i=1:(n-1)

A(i,i) = 1;

A(i,i+1) = 1;

end

A(n,n)=1;

end

% Матрица № 3

if (tM==3)

n=7;

exp_Data(count) = n;

count = count+1;

A =[5 4 7 5 6 7 5;

4 12 8 7 8 8 6;

7 8 10 9 8 7 7;

5 7 9 11 9 7 5;

6 8 8 9 10 8 9;

7 8 7 7 8 10 10;

5 6 7 5 9 10 10];

end

% Матрица № 6

if (tM==6)

n=8;

exp_Data(count) = n;

count = count+1;

t = pi*0.999;

A = [cot(t) csc(t) (1-cot(t)) csc(t) 1 1 1 1;

-csc(t) cot(t) -csc(t) (1+cot(t)) 1 1 1 1;

(1-cot(t)) csc(t) cot(t) csc(t) (1-cot(t)) csc(t) 1 1

-csc(t) (1+cot(t)) -csc(t) cot(t) -csc(t) (1+cot(t)) 1 1;

1 1 (1-cot(t)) csc(t) cot(t) csc(t) (1-cot(t)) csc(t);

1 1 -csc(t) (1+cot(t)) -csc(t) cot(t) -csc(t) (1+cot(t));

1 1 1 1 (1-cot(t)) csc(t) cot(t) csc(t);

1 1 1 1 -csc(t) (1+cot(t)) -csc(t) cot(t)];

end

% Матрица № 10

if (tM==10)

n=4;

exp_Data(count) = n;

count = count+1;

A = [ 0.9143*10^(-4) 0 0 0;

0.8762 0.7156*10^(-4) 0 0;

0.7943 0.8143 0.9504*10^(-4) 0;

0.8017 0.6123 0.7165 0.7123*10^(-4) ];

end

 

x_ex = zeros(n,1);

b_ex = zeros(n,1);

for i=1:n

x_ex(i) = i;

end;

 

% Вычисляем вектор b, соответствующий точному решению

for i=1:n

for j=1:n

b_ex(i) = b_ex(i) + A(i,j) * x_ex(j);

end

end

 

% Засекаем время

tic

[A, p, znak, op_numb] = factorization(A, n);

[x_calc,op_numb_2] = SLAE(A, b_ex, n, p, q);

exp_Data(count) = toc;

count = count+1;

 

% Вычисляем точность найденного решения

for i=1:n

ex = abs(x_ex(i) - x_calc(i));

if (i == 1)

max_ex = ex;

else

if (ex > max_ex)

max_ex = ex;

end

end

end

exp_Data(count) = max_ex;

count = count +1;

 

exp_Data(count) = n^3/3;

count = count +1;

 

exp_Data(count) = op_numb + op_numb_2;

count = count + 1;

 

 

dlmwrite('file.dat',exp_Data,';');

clear A;

clear exp_Data;

 

read_data = dlmread('file.dat', ';');

 

% Вывод таблицы

disp(' Порядок Время Точность Теоретическое ЧО Реальное ЧО');

n_ar = read_data(1);

time_ar = read_data(2);

ex_ar = read_data(3);

th_numb_ar = read_data(4);

fact_numb_ar = read_data(5);

str = [round(read_data(1)), read_data(2), read_data(3), round(read_data(4)), round(read_data(5))];

disp(str);

 

format(frmt)

format(frmtV)

end

 

Матрица Гильберта

 

 

Рис. 11. Таблица экспериментальных данных для матрицы Гильберта

 

 

Рис. 12. График зависимости времени решения от размера матрицы Гильберта

 

 

Рис. 13. График зависимости точности решения от размера матрицы Гильберта

 

Матрица № 2

 

 

Рис. 14. Таблица экспериментальных данных для матрицы № 2

 

Матрица № 3

 

 

Рис. 15. Таблица экспериментальных данных для матрицы № 3

 

 

Матрица № 4

 

 

Рис. 16. Таблица экспериментальных данных для матрицы № 4

 

 

Рис. 17. График зависимости времени решения от размера матрицы № 4

 

 

Рис. 18. График зависимости точности решения от размера матрицы № 4

 

Матрица № 5

 

 

Рис. 19. Таблица экспериментальных данных для матрицы № 5

 

 

Рис. 20. График зависимости времени решения от размера матрицы № 5

 

 

Рис. 21. График зависимости точности решения от размера матрицы № 5

 

Матрица № 6

 

Параметр q =0.999* p

 

 

Рис. 22. Таблица экспериментальных данных для матрицы № 6

 

Матрица № 7

 

Параметр a =5.

 

 

Рис. 23. Таблица экспериментальных данных для матрицы № 7

 

 

Рис. 24. График зависимости времени решения от размера матрицы № 7

 

 

Рис. 25. График зависимости точности решения от размера матрицы № 7

Матрица № 8

 

 

Рис. 26. Таблица экспериментальных данных для матрицы № 8

 

 

Рис. 27. График зависимости времени решения от размера матрицы № 8

 

 

Рис. 28. График зависимости точности решения от размера матрицы № 8

 

Матрица № 9

 

 

Рис. 29. Таблица экспериментальных данных для матрицы № 9

 

 

Рис. 30. График зависимости времени решения от размера матрицы № 9

 

 

Рис. 31. График зависимости точности решения от размера матрицы № 9

 

Матрица № 10

 

 

Рис. 32. Таблица экспериментальных данных для матрицы № 10

 

Задание № 9 “ Эксперимент 3 “Обращение случайных матриц ”

 

Цель эксперимента – исследовать скорость и точность обращения матриц разными способами: через решение системы AX=E, где E – единичная матрица, и через разложение матрицы A в произведение элементарных матриц.

В ходе эксперимента определяется число операций умножения и деления, точность и скорость обращения случайно сгенерированных матриц порядка от 5 до 100 (через 5 порядков). Значения элементов матриц генерируются в диапазоне от -100 до 100.

Для вычисления точности обращения матрицы A умножаем исходную матрицу на найденную обратную и вычитаем результат из единичной матрицы, затем находим норму найденной разности и делим её на норму исходной матрицы. Норму матрицы вычисляем как максимальная сумма модулей элементов строк.

Результаты эксперимента записываются в файл, а затем выводятся на экран в виде таблицы и графиков.

 

Программный код функции вычисления точности обращения матрицы:

 

function [norm] = exact_func(A_orig, A_ob, n)

% вычисляем точность обращения

 

Mult = A_orig*A_ob;

Mult=eye(n,n)-Mult;

 

for i=1:n

sum_a = 0;

sum_mult = 0;

for j=1:n

sum_a = sum_a + abs(A_orig(i,j));

sum_mult = sum_mult + abs(Mult(i,j));

end

if (i==1)

max_a = sum_a;

max_mult = sum_mult;

else

if (sum_a > max_a)

max_a = sum_a;

end

if (sum_mult > max_mult)

max_mult = sum_mult;

end

end

end

 

norm = max_mult/max_a;

 

end

 

Программный код эксперимента №3:

 

function [] = exp3()

clc;

frmt = get(0,'Format');

frmtV = get(0,'FormatSpacing');

format('shortG')

format('compact')

exp_Data = zeros(1,160);

count = 1;

for n=5:5:100

exp_Data(count) = n;

count = count+1;

A = randi([-100,100],n,n);

A_orig = A;

 

[A, p, q, znak, op_numb] = factorization(A, n);

 

tic

[V, count_ops_1] = inversion_1(A, n, p, q);

exp_Data(count) = toc;

count = count+1;

 

tic

[A_ob, count_ops_2] = inversion_2(A, n, p, q);

exp_Data(count) = toc;

count = count+1;

 

[norm] = exact_func(A_orig, V, n);

exp_Data(count) = norm;

count = count+1;

 

[norm] = exact_func(A_orig, A_ob, n);

exp_Data(count) = norm;

count = count+1;

 

exp_Data(count) = n^3;

count = count +1;

 

exp_Data(count) = count_ops_1+op_numb;

count = count+1;

 

exp_Data(count) = count_ops_2+op_numb;

count = count+1;

 

 

end

 

dlmwrite('file_obr.dat',exp_Data,';');

clear A;

clear exp_Data;

 

n_ar = zeros(1,20);

time_ar_1 = zeros(1,20);

time_ar_2 = zeros(1,20);

ex_ar_1 = zeros(1,20);

ex_ar_2 = zeros(1,20);

th_numb_ar = zeros(1,20);

fact_numb_ar_1 = zeros(1,20);

fact_numb_ar_2 = zeros(1,20);

 

read_data = dlmread('file_obr.dat', ';');

 

count = 1;

 

disp(' Порядок Время1 Время2 Точность1 Точность2 Теор. ЧО Реал. ЧО_1 Реал. ЧО_2');

for i=1:8:160

n_ar(count) = read_data(i);

time_ar_1(count) = read_data(i+1);

time_ar_2(count) = read_data(i+2);

ex_ar_1(count) = read_data(i+3);

ex_ar_2(count) = read_data(i+4);

fact_numb_ar_1(count) = read_data(i+5);

fact_numb_ar_2(count) = read_data(i+6);

th_numb_ar(count) = read_data(i+7);

count = count + 1;

str = [round(read_data(i)), read_data(i+1), read_data(i+2), read_data(i+3), read_data(i+4), round(read_data(i+5)), round(read_data(i+6)),round(read_data(i+7))];

disp(str);

end

 

% Вывод графиков

plot(n_ar, time_ar_1, n_ar, time_ar_2, '--');

title('Зависимость времени обращения от размера матрицы A (мск)');

legend('Первый способ','Второй способ',2);

grid on;

 

figure;

plot(n_ar, ex_ar_1, n_ar, ex_ar_2, '--');

title('Зависимость точности обращения от размера матрицы A');

legend('Первый способ','Второй способ',2);

grid on;

 

figure;

plot(n_ar, th_numb_ar, '-o', n_ar, fact_numb_ar_1, '-x', n_ar, fact_numb_ar_2, '-*');

title('Количество операций от размера матрицы A');

legend('Теоретическое ЧО','Реальное ЧО_1','Реальное ЧО_2',2);

grid on;

 

format(frmt)

format(frmtV)

end

 

 

 

Рис. 38. Таблица экспериментальных данных для эксперимента №3

Рис. 39. График зависимости времени обращения первым и вторым способом от размера матриц.

Из графика, представленного на рис. 39, можно сделать вывод, что время обращения первым способом меньше времени обращения вторым способом, т. е. первый способ обращения матриц эффективнее по времени.

 

Рис. 40. График зависимости точности обращения первым и вторым способом от размера матриц.

 

Из графика, представленного на рис. 40, можно сделать вывод, что точность вычисления обратной матрицы первым способом выше, чем вторым.

 

 

Рис 41. График зависимости теоретического и реального первым и вторым способом числа операций от порядка матриц.

 

 

Выводы: в ходе выполнения лабораторного проекта был написан программный проект на языке MATLAB, реализующий - разложение на основе гауссова исключения по активной подматрице с выбором главного элемента по столбцу для численного решения системы линейных алгебраических уравнений Ax=f, вычисления определителя и нахождения обратной матрицы A.

Программа включает в себя следующие функции:

1. Функция факторизации матрицы.

2. Функция решения системы линейных алгебраических уравнений.

3. Функция вычисления определителя матрицы.

4. Функция обращения матрицы через решение системы AX = E.

5. Функция обращения матрицы через элементарные преобразования разложения.

 

Также были выполнены эксперименты:

1. Эксперимент 1 “Решение СЛАУ”.

2. Эксперимент 2 “Решение СЛАУ с плохо обусловленными матрицами”.

3. Эксперимент 3 “Обращение случайных матриц”.

В ходе выполнения экспериментов было оценено время выполнения вычислений, точность вычислений и число производимых операций умножения и деления.

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: