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

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

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

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

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

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

Міністерство освіти і науки України Національний університет „Львівська політехніка” Кафедра ЕОМ Звіт про виконання лабораторної роботи №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:54

Коментарі

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

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

Нічого не вибрано
0%

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

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

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

Admin

26.02.2023 12:38

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