ВИКОРИСТАННЯ ФУНКЦІОНАЛЬНОЇ ДЕКОМПОЗИЦІЇ ДЛЯ РОЗВ’ЯЗКУ ОБЧИСЛЮВАЛЬНИХ ЗАДАЧ

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Кафедра ЕОМ

Інформація про роботу

Рік:
2005
Тип роботи:
Звіт про виконання лабораторної роботи
Предмет:
Паралельні та розподілені обчислення

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки України Національний університет „Львівська політехніка” Кафедра ЕОМ Звіт про виконання лабораторної роботи №1 з курсу „ паралельні та розподілені обчислення” на тему„ ВИКОРИСТАННЯ ФУНКЦІОНАЛЬНОЇ ДЕКОМПОЗИЦІЇ ДЛЯ РОЗВ’ЯЗКУ ОБЧИСЛЮВАЛЬНИХ ЗАДАЧ” Львів 2005 Тема: Використання функціональної декомпозиції для розв’язку обчислювальних задач. Мета: Вивчити методи декомпозицій задач. Набути навиків розв’язування задач з використанням функціональної декомпозиції. Варіант №15 15  рядок   bi=i для парних і bi=15/i для непарних і 15A1b1+c1 A2С2+B2 Cij=15/(i2+j)   Схема декомпозиції:  Текст програми: #include <stdio.h> #include <string.h> #include <iostream.h> #include <math.h> #include <stdlib.h> #include <fstream.h> #include <time.h> #include <iomanip.h> class ofstream o("zvit.txt"); void delay() { for(int i=0;i<1000;i++); } double** AddMas(double** a, double** b, int n) { int i,j; double **c; c = new double*[n]; for(j=0; j<n; j++) { c[j]= new double[n]; } for(i=0; i<n; i++) { for(j=0;j<n; j++) { c[i][j] = a[i][j] + b[i][j]; } } return c; } double** DeductMas(double **a, double **b, int n) { int i,j; double **c; c = new double*[n]; for(j=0; j<n; j++) { c[j]= new double[n]; } for(i=0; i<n; i++) { for(j=0; j<n; j++) { c[i][j] = a[i][j] - b[i][j]; } } return c; } double* AddVector(double *a, double *b, int n) { int i; double *c; c = new double[n]; for(i=0; i<n; i++) { c[i] = a[i] + b[i]; } return c; } double* DeductVector(double *a, double *b, int n) { int i; double *c; c = new double[n]; for(i=0; i<n; i++) { c[i] = a[i] - b[i]; } return c; } double** MulMatrix_Number(double **a, double con, int n) { int i, j; double **c; c = new double*[n]; for(j=0; j<n; j++) { c[j]= new double[n]; } for(i=0; i<n; i++) { for(j=0; j<n; j++) { c[i][j] = a[i][j] * con; } } return c; } double** MulMatrix_Matrix(double **a, double **b, int n) { int i, j, k; double **c; double s; c = new double*[n]; for(j=0; j<n; j++) { c[j]= new double[n]; } for(i=0; i<n; i++) { for(j=0; j<n; j++) { s = 0; for(k=0; k<n; k++) { s = s + a[i][k] * b[k][j]; } c[i][j] = s; } } return c; } double* MulVector_Number(double *a, double con, int n) { int i; double* c; c = new double[n]; for(i=0; i<n; i++) { c[i] = a[i] * con; } return c; } double MulVector(double *a, double *b, int n) { int i; double c; //c = new double[n]; c=0; for(i=0; i<n; i++) { c = c + a[i] * b[i]; } return c; } double* MulMatrix_Vector(double **a, double *b, int n) { int i, k; double s; double *c; c = new double[n]; for(i=0; i<n; i++) { s = 0; for(k=0; k<n; k++) { s = s + a[i][k] * b[k]; } c[i] = s; } return c; } double** Transp(double **a, int n) { int i, j; double prom; for(i=0; i<n; i++) { for(j=0; j<n; j++) { prom = a[i][j]; a[j][i] = prom; } } return a; } double** InputMas(int n) { double **a; a = new double*[n]; int j; for(j=0; j<n; j++) { a[j]= new double[n]; } int i; for(i=0; i<n; i++) { for(j=0; j<n; j++) { cout << "Matrix[" << i << "][" << j << "]="; cin >> a[i][j]; } } return a; } double* InputVector(int n) { double *a; a = new double[n]; int i; for(i=0; i<n; i++) { cout << "a[" << i << "]="; cin >> a[i]; } return a; } double** MatrixC(int n) { int i, j; double **c; c = new double*[n]; for(j=0; j<n; j++) { c[j]= new double[n]; } for(i=0; i<n; i++) { for(j=0; j<n; j++) { c[i][j] = 15 * (pow(i+1,2)+j); } } return c; } double* VectorBi(int n) { double *b; b = new double[n]; int i, j; j = 1; for(i=0; i<n; i++) { if((j%2)==0) b[i] = j;else b[i]=15/j; j = j + 1; } return b; } void FreeMem(double **a, int n) { for(int j=0; j<n;j++) { delete [] a[j]; } delete [] a; } void FreeMemVector(double *a, int n) { delete [] a; } double** AvtoGen(int n) { double **a; a = new double*[n]; int j; for(j=0; j<n; j++) { a[j]= new double[n]; } int i; for(j=0; j<n; j++) { for(i=0; i<n; i++) { a[j][i] = rand()%10+1; } } return a; } double* AvtoGenVector(int n) { double *a; a = new double[n]; int i; for(i=0; i<n; i++) { a[i] = rand()%10+1; } return a; } void Out(double **a, int n) { int i, j; for(i=0; i<n; i++) { for(j=0; j<n; j++) { cout <<setw(15)<< a[i][j]; } cout << "\n"; } cout << "\n"; } void Out(double *a, int n) { int i; for(i=0; i<n; i++) { cout <<setw(15)<< a[i]; } cout << "\n"; } void Out(double a) { cout<<setw(15)<<a<< "\n"; } void FileOut(double **a, int n) { int i, j; for(i=0; i<n; i++) { for(j=0; j<n; j++) { o << setw(15) << a[i][j]; } o << "\n"; } o << "\n"; flushall(); } void FileOut(double *a, int n) { int i; for(i=0; i<n; i++) { o <<setw(15)<< a[i]; } o << "\n"; flushall(); } void FileOut(double a) { o<<setw(15)<<a<< "\n"; flushall(); } double** step1(double **a, double **b, int n) { return MulMatrix_Matrix(a,b,n); } double* step2(double **a, double *b, double con, int n) { return MulMatrix_Vector(MulMatrix_Number(a,con,n),b,n); } double** step3(double **a, double **b, int n) { return AddMas(a,b,n); } double* step4(double *a, double *b, int n) { return AddVector(a,b,n); } double* step5(double **a, double *b, int n) { return MulMatrix_Vector(a,b,n); } double* step6(double *a, double *b, int n) { return AddVector(a,b,n); } double** step7(double **a, int n) { return MulMatrix_Matrix(a,a,n); } double step8(double *a, double *b, int n) { return MulVector(a,b,n); } double* step9(double **a, double *b, int n) { return MulMatrix_Vector(a,b,n); } double* step10(double **a, double *b, int n) { return MulMatrix_Vector(a,b,n); } double* step11(double *a, double con, int n) { return MulVector_Number(a,con,n); } double* step12(double *a, double *b, int n) { return AddVector(a,b,n); } double* step13(double *a, double *b, int n) { return AddVector(a,b,n); } void main() { srand(time(NULL)); class ofstream o("zvit.txt"); flushall(); cout << "Enter n: "; int n; cin >> n; double **A, **A1, **A2, **B2, *b1, *c1; char menu; cout << "MENU\n"; cout << "1. Input matrix from keyboard\n"; cout << "2. Avtogenerate matrix\n"; cin >> menu; switch (menu){ case '1': cout << "Matrix A:\n"; A = InputMas(n); cout << "Matrix A1:\n"; A1 = InputMas(n); cout << "Matrix A2:\n"; A2 = InputMas(n); cout << "Matrix B2:\n"; B2 = InputMas(n); cout << "Matrix b1:\n"; b1 = InputVector(n); cout << "Matrix c1:\n"; c1 = InputVector(n); break; case '2': A = AvtoGen(n); A1 = AvtoGen(n); A2 = AvtoGen(n); B2 = AvtoGen(n); b1 = AvtoGenVector(n); c1 = AvtoGenVector(n); break; default: cout << "Enter number of menu!!!\n"; } double **C2; C2 = MatrixC(n); double *b; b = VectorBi(n); cout << "Matrix A:\n"; o<< "Matrix A:\n"; Out(A,n); FileOut(A,n); delay(); cout << "Matrix A1:\n"; o<< "Matrix A1:\n"; Out(A1,n); FileOut(A1,n); delay(); cout << "Matrix A2:\n"; o<< "Matrix A2:\n"; Out(A2,n); FileOut(A2,n); delay(); cout << "Matrix B2:\n"; o<< "Matrix B2:\n"; Out(B2,n); FileOut(B2,n); cout << "Vector b1:\n"; o<< "Vector b1:\n"; Out(b1,n); FileOut(b1,n); cout << "Vector c1:\n"; o<< "Vector c1:\n"; Out(c1,n); FileOut(c1,n); cout << "Vector b:\n"; o<< "Vector b:\n"; Out(b,n); FileOut(b,n); char a; cin >> a; cout << "-----------------------Step1--------------------------\n"; double** TMPMatr1; TMPMatr1=step1(A2,C2,n); cout << "Step1 - TMPMatr1:\n"; o<<setw(15)<< "Step1 - TMPMatr1:\n"; Out(TMPMatr1,n); FileOut(TMPMatr1,n); cout << "-----------------------Step2--------------------------\n"; double *TMPVect1; TMPVect1=step2(A1,b1,15,n); cout << "Step2 - TMPVect1:\n"; o<<setw(15)<< "Step2 - TMPVect1:\n"; Out(TMPVect1,n); FileOut(TMPVect1,n); cout << "-----------------------Step3--------------------------\n"; double** y3; y3=step3(TMPMatr1,B2,n); cout << "Step3 - y3:\n"; o<< "Step3 - y3:\n"; Out(y3,n); FileOut(y3,n); cout << "-----------------------Step4--------------------------\n"; double* y2; y2=step4(TMPVect1,c1,n); cout << "Step4 - y2:\n"; o<< "Step4 - y2:\n"; Out(y2,n); FileOut(y2,n); cout << "-----------------------Step5--------------------------\n"; double* y1; y1=step5(A,b,n); cout << "Step5 - y1:\n"; o<< "Step5 - y1:\n"; Out(y1,n); FileOut(y1,n); cout << "-----------------------Step6--------------------------\n"; TMPVect1=step6(y2,y1,n); cout << "Step6 - TMPVect1:\n"; o<< "Step6 - TMPVect1:\n"; Out(TMPVect1,n); FileOut(TMPVect1,n); cout << "-----------------------Step7--------------------------\n"; TMPMatr1=step7(y3,n); cout << "Step7 - TMPMatr1:\n"; o<< "Step7 - TMPMatr1:\n"; Out(TMPMatr1,n); FileOut(TMPMatr1,n); cout << "-----------------------Step8--------------------------\n"; double TMPNumber1; TMPNumber1=step8(y2,y2,n); cout << "Step8 - TMPNumber1:\n"; o<< "Step8 - TMPNumber1:\n"; Out(TMPNumber1); FileOut(TMPNumber1); cout << "-----------------------Step9--------------------------\n"; double* TMPVect2; TMPVect2=step9(y3,y1,n); cout << "Step9 - TMPVect2:\n"; o<< "Step5 - TMPVect2:\n"; Out(TMPVect2,n); FileOut(TMPVect2,n); cout << "-----------------------Step10-------------------------\n"; double* TMPVect3; TMPVect3=step10(TMPMatr1,y1,n); cout << "Step10 - TMPVect3:\n"; o<< "Step10 - TMPVect3:\n"; Out(TMPVect3,n); FileOut(TMPVect3,n); cout << "-----------------------Step11-------------------------\n"; TMPVect2=step11(TMPVect2,TMPNumber1,n); cout << "Step11 - TMPVect2:\n"; o<< "Step11 - TMPVect2:\n"; Out(TMPVect2,n); FileOut(TMPVect2,n); cout << "-----------------------Step12--------------------------\n"; TMPVect1=step12(TMPVect1,TMPVect3,n); cout << "Step12 - TMPVect1:\n"; o<< "Step12 - TMPVect1:\n"; Out(TMPVect1,n); FileOut(TMPVect1,n); cout << "-----------------------Step13--------------------------\n"; double* x; x=step13(TMPVect1,TMPVect2,n); cout << "Step13 - x:\n"; o<< "Step13 - x:\n"; Out(x,n); FileOut(x,n); FreeMem(A,n); FreeMem(A1,n); FreeMem(A2,n); FreeMem(B2,n); FreeMem(C2,n); FreeMem(TMPMatr1,n); FreeMemVector(b1,n); FreeMemVector(c1,n); FreeMemVector(b,n); FreeMemVector(y1,n); FreeMemVector(y2,n); FreeMem(y3,n); FreeMemVector(TMPVect1,n); FreeMemVector(TMPVect2,n); FreeMemVector(TMPVect3,n); } Висновок: Використовуючи декомпозицію задачу можливо розбити на підзадачі тим самим забезпечуючи можливість паралельного виконання. Для даної задачі оптимальна кількість процесорів – це 2-3.
Антиботан аватар за замовчуванням

14.09.2012 00:09-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!