Міністерство Освіти і Науки України
Національний Університет “Львівська Політехніка”
Кафедра ЕОМ
ЗВІТ
до лабораторної роботи № 1
з курсу “Паралельні та розподілені обчислення ”
Тема: ВИКОРИСТАННЯ ФУНКЦІОНАЛЬНОЇ ДЕКОМПОЗИЦІЇ ДЛЯ РОЗВ’ЯЗКУ ОБЧИСЛЮВАЛЬНИХ ЗАДАЧ.
Мета: Вивчити методи декомпозицій задач. Набути навиків розв’язування задач з використанням функціональної декомпозиції.
ЗМІСТ ЗВІТУ
1.Тема, мета, аналіз завдання(згідно варіанту).
2. Схема декомпозиції задачі та коментарі до неї.
3. Текст програми та результат її роботи на довільному наборі вхідних даних, для розмірності n>3.
4. Висновки.
Аналіз завдання
Завдання:
Варіант №25 число,
Де y1, y2, Y3, b, Cij обчислюються так:
y1 = A*b, де bi = 25 - для парних і, bi=25/і3 - для непарних і=1,2,...n
y2 = A1 (b1 + c1)
Y3 = A2 (С2 +В2 ) , де Cij =25/(i + j)3
Виконання:
Дані які вводяться з клавіатури:
розмірність матриць – n;
матриці A, A1, A2, B2 ;
вектори-стовпці b1,c1 .
Ці дані треба вводити з клавіатури, або генерувати випадковим чином n –генерувати не треба. Елементи матриць та векторів є цілими додатними числами, більшими за нуль.
Вектор-стовпець b та матриця C2 обраховуються, відповідно до розмірності, значення їх елементів завжди менші одиниці і різко зменшуються зі збільшенням розмірності n.
Під час обчислення y1 результатом множення матриці А на вектор-стовпець b має бути вектор-стовпець, елементами, якого є дробові числа.
Під час обчислення y2 результатом додавання двох вектор-стовпців буде вектор-стовпець.
При множенні матриці А1 на результат додавання b1+c1, отримаємо вектор-стовпець.
При обчисленні Y3 отримаємо матрицю з дробових чисел.
В обчисленні загального виразу приймають участь три різні елементи – два вектори стовпці y1, y2 та матриця Y3.
Остаточним результатом є число.
Схема декомпозиції задачі
Код програми
//matrix.cpp
#include "matrix.h"
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <assert.h>
#include <iomanip>
#include <stdlib.h>
#include <shlwapi.h>
using namespace std;
Calculate_Matrix::Calculate_Matrix(const int i,const int j)
{
x=i; y=j;
mas = new double*[x];
for(int k=0;k<=x;k++)
{
mas[k] = new double[y];
}
}
void Calculate_Matrix::put(const int i, const int j,const double z)
{
mas[i][j]=(double )z;
}
double Calculate_Matrix::get( int i, int j)
{
return mas[i][j];
}
void Calculate_Matrix::madd(const Calculate_Matrix a, const Calculate_Matrix b)
{
for(int k=0; k<a.x; k++)
for(int m=0; m<a.y; m++)
mas[k][m] = a.mas[k][m]+b.mas[k][m];
}
void Calculate_Matrix::transp(const Calculate_Matrix a)
{
for(int k=0; k<y; k++)
mas[0][k] = a.mas[k][0];
}
void Calculate_Matrix::mmul(const Calculate_Matrix a, const Calculate_Matrix b)
{
Calculate_Matrix(a.x,b.y);
for(int i=0; i<a.x; i++)
for(int j=0; j<b.y; j++)
{
double s=0;
for(int k=0; k<a.y; k++)
s+=a.mas[i][k]*b.mas[k][j];
mas[i][j]=s;
}
}
void Calculate_Matrix::print()
{
for(int k=0; k<x; k++)
{
for(int m=0; m<y; m++)
cout<<setw(15)<<fixed<<mas[k][m]<<" ";
cout<<endl;
}
cout<<endl;;
}
bool isNumber(const string str)
{
unsigned length = str.length();
for (unsigned i=0; i<length; ++i) if(str[i]>'9' || str[i]<'0') return false;
return true;
}
void Calculate_Matrix::input()
{
int mn;
char ch[64];
for(int i=0; i<x; i++)
for(int j=0; j<y; j++)
{
cout<<endl<<"element ["<<i<<"]["<<j<<"]=";
cin>>ch;
if(isNumber(ch))
{
mn = atoi(ch);
mas[i][j]=mn;
}
else
{
cout << "Vvedit' chyslo"<<endl;
cout<<endl<<"element ["<<i<<"]["<<j<<"]=";
cin>>ch;
mn = atoi(ch);
mas[i][j]=mn;
}
}
cout<<endl;
}
//main.cpp
#include <iostream>
#include <stdlib.h>
#include "matrix.h"
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <ctype.h>
using namespace std;
int main(int argc, char* argv[])
{
int i,j;
int n;
double buf;
char choice;
char choice1;
cout<<"This program calculate expression:"<<endl<<endl<<
"X=(y1'*Y3*y2+y2')*(Y3*Y3*Y3*y1+y1+y1*y2'*Y3*y1)"<<endl<<endl;
cout<<"y1=A*b - vector"<<endl;
cout<<"y2=A1(b1+c1) - vector"<<endl;
cout<<"Y3=A2(B2+C2) - matrix"<<endl;
cout<<"Matrix A, A1, A2, B2 Enter on keyboard else generate random."<<endl<<endl;
cout<<"=============================================================="<<endl;
do{
cout<<"Enter the size of matrix :";
cin>>n;
cout<<endl;
//if(n<3||n>=18)
//{
// cout<<"Incorect ""n"", please enter ""n"" within 3<=n<=18!!!"<<endl;
//}
// else{
cout<<"Enter data of keyboard Y/N?:";
cin>>choice;
cout<<endl;
Calculate_Matrix y1(n,1),y2(n,1),Y3(n,n), X(1,1);
Calculate_Matrix YY2(n,n), mul1(1,n),YY3(n,n),Y3y1(n,1),y1y2t(n,1), YY3y1(n,1), ty1(1,n),ty2(1,n), ty1Y3(1,n);
Calculate_Matrix C2(n,n),B2(n,n),A2(n,n),b1(n,1),c1(n,1),A1(n,n),b(n,1),A(n,n),st2BC(n,n),st2bc(n,1);
// state 1
cout<<endl<<endl<<"state 1"<<endl;
if(choice=='y')
{
cout<<"Please enter only namber of 1 to 100"<<endl;
cout<<"Input B2:";
B2.input();
cout<<"Input A2:";
A2.input();
cout<<"Input A1:";
A1.input();
cout<<"Input b1:";
b1.input();
cout<<"Input c1:";
c1.input();
cout<<"Input A:";
A.input();
for(i=0;i<=n;i++){
for(j=0;j<=n;j++)
{
buf=(double)25/((i+j+1)*(i+j+1)*(i+j+1));
C2.put(i,j,buf);
}
}
for(i=0;i<n;i++)
{
b.put(i,0,(double )fmod((double )(i+1),(double )2)>0 ? ((double )25/((i+1)*(i+1))):((double )25));
}
}
else{
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
{
buf=(double)25/((i+j+1)*(i+j+1)*(i+j+1));
C2.put(i,j,buf);
}
cout<<endl<<endl<<"C2"<<endl;
C2.print();
for(i=0;i<n;i++)
for(j=0;j<n;j++)
B2.put(i,j,(double)rand() / (RAND_MAX + 1) * n );
cout<<endl<<endl<<"B2"<<endl;
B2.print();
for(i=0;i<n;i++)
for(j=0;j<n;j++)
A2.put(i,j,(double)rand() / (RAND_MAX + 1) * n);
cout<<endl<<endl<<"A2"<<endl;
A2.print();
for(i=0;i<n;i++)
b1.put(i,0,(double)rand()/ (RAND_MAX + 1) * n);
cout<<endl<<endl<<"b1"<<endl;
b1.print();
for(i=0;i<n;i++)
c1.put(i,0,(double)rand()/ (RAND_MAX + 1) * n);
cout<<endl<<endl<<"c1"<<endl;
c1.print();
for(i=0;i<n;i++)
for(j=0;j<n;j++)
A1.put(i,j,(double)rand() / (RAND_MAX + 1) * n);
cout<<endl<<endl<<"A1"<<endl;
A1.print();
for(i=0;i<n;i++)
b.put(i,0,(double )fmod((double )(i+1),(double )2)>0 ? ((double )25/((i+1)*(i+1))):((double )25));
cout<<endl<<endl<<"b"<<endl;
b.print();
for(i=0;i<n;i++)
for(j=0;j<n;j++)
A.put(i,j,(double)rand() / (RAND_MAX + 1) * n);
cout<<endl<<endl<<"A"<<endl;
A.print();
}
// state 2
cout<<endl<<endl<<"state 2"<<endl;
st2BC.madd(B2,C2);
cout<<endl<<endl<<"B2+C2"<<endl;
st2BC.print();
st2bc.madd(b1,c1);
cout<<endl<<endl<<"b1+c1"<<endl;
st2bc.print();
//state 3
cout<<endl<<endl<<"state 3"<<endl;
Y3.mmul(A2,st2BC);
cout<<endl<<endl<<"Y3=A2*(B2+C2)"<<endl;
Y3.print();
y2.mmul(A1,st2bc);
cout<<endl<<endl<<"y2=A1*(b1+c1)"<<endl;
y2.print();
y1.mmul(A,b);
cout<<endl<<endl<<"y1=A*b"<<endl;
y1.print();
//state 4
cout<<endl<<endl<<"state 4"<<endl;
ty1.transp(y1);
ty1Y3.mmul(ty1,Y3);
cout<<endl<<endl<<"y1'*Y3"<<endl;
ty1Y3.print();
//state 5
cout<<endl<<endl<<"state 5"<<endl;
ty1.mmul(ty1Y3,y2);
cout<<endl<<endl<<"y1'*Y3*y2"<<endl;
ty1.print();
YY2.mmul(Y3,Y3);
YY3.mmul(YY2,Y3);
cout<<endl<<endl<<"Y3*Y3*Y3"<<endl;
YY3.print();
//state 6
cout<<endl<<endl<<"state 6"<<endl;
ty2.transp(y2);
mul1.madd(ty1, ty2);
cout<<endl<<endl<<"y1'*Y3*y2+y2'"<<endl;
mul1.print();
YY3y1.mmul(YY3,y1);
cout<<endl<<endl<<"Y3*Y3*Y3*y1"<<endl;
YY3y1.print();
Y3y1.mmul(Y3,y1);
cout<<endl<<endl<<"Y3*y1"<<endl;
Y3y1.print();
y1y2t.mmul(y1,ty2);
cout<<endl<<endl<<"y1*y2'"<<endl;
y1y2t.print();
//state 7
cout<<endl<<endl<<"state 7"<<endl;
YY3y1.madd(YY3y1,y1);
cout<<endl<<endl<<"Y3*y1+y1"<<endl;
YY3y1.print();
Y3y1.mmul(Y3y1,y1y2t);
cout<<endl<<endl<<"y1*y2'*Y3*y1"<<endl;
Y3y1.print();
//state 8
cout<<endl<<endl<<"state 8"<<endl;
Y3y1.madd(Y3y1,YY3y1);
cout<<endl<<endl<<"Y3*Y3*Y3*y1+y1+y1*y2'*Y3*y1"<<endl;
Y3y1.print();
//state 9
cout<<endl<<endl<<"state 9"<<endl;
X.mmul(mul1,Y3y1);
cout<<endl<<endl<<"X= ";
X.print();
cout<<"======================================================="<<endl<<endl;
//}
cout<<"Do you want calculate y/n?"<<endl;
cout<<"Press any key and press enter for exit."<<endl;
cin>>choice1;
}
while(choice1=='y');
getch();
return 0;
}
Результати виконання:
This program calculate expression:
X=(y1'*Y3*y2+y2')*(Y3*Y3*Y3*y1+y1+y1*y2'*Y3*y1)
y1=A*b - vector
y2=A1(b1+c1) - vector
Y3=A2(B2+C2) - matrix
Matrix A, A1, A2, B2 Enter on keyboard else generate random.
==============================================================
Enter the size of matrix :4
Enter data of keyboard Y/N?:n
state 1
C2
25.000000 3.125000 0.925926 0.390625
3.125000 0.925926 0.390625 0.200000
0.925926 0.390625 0.200000 0.115741
0.390625 0.200000 0.115741 0.072886
B2
0.005005 2.254272 0.773193 3.234863
2.339966 1.919434 1.401123 3.583740
3.291260 2.986328 0.696411 3.435669
2.841919 2.054077 1.215942 0.059937
A2
0.365601 1.457764 0.589233 0.663574
3.953979 1.782715 0.476318 0.018677
0.035645 1.511475 2.126587 2.284668
2.406982 2.428589 0.664917 2.652100
b1
1.803101
1.408447
0.228149
2.430664
c1
3.133179
3.210327
2.079468
1.207764
A1
3.503784 2.906616 3.823486 3.702759
2.157349 0.569336 1.848267 0.941284
3.448853 0.838379 3.118530 3.374512
3.987061 3.998657 2.445923 1.569702
b
25.000000
25.000000
2.777778
25.000000
A
1.064819 1.189087 3.360474 0.094971
1.503418 0.370483 2.708740 0.224854
0.035156 3.675049 1.103516 1.091553
2.351563 2.764648 3.350342 2.905884
state 2
B2+C2
25.005005 5.379272 1.699119 3.625488
5.464966 2.845360 1.791748 3.783740
4.217186 3.376953 0.896411 3.551410
3.232544 2.254077 1.331683 0.132823
b1+c1
4.936279
4.618774
2.307617
3.638428
state 3
Y3=A2*(B2+C2)
21.738413 9.600088 4.645010 9.022027
110.680849 27.992601 10.364307 22.774519
25.504950 16.823632 7.717496 13.704094
84.835869 28.081453 12.568965 20.629288
y2=A1*(b1+c1)
53.016025
20.968796
40.371074
49.505642
y1=A*b
68.056573
59.993150
123.109266
209.858873
state 4
y1'*Y3
29062.990324 10297.000639 4525.714995 7996.663365
state 5
y1'*Y3*y2
2335307.847335 59.993150 123.109266 209.858873
Y3*Y3*Y3
207412.424162 70410.723661 30671.494458 58748.212650
682375.292202 231205.930326 100626.736752 192470.788185
316633.358142 107649.052289 46931.560949 89944.074951
613800.143679 208118.692634 90614.878318 173407.717982
state 6
y1'*Y3*y2+y2'
2335360.863360 80.961946 163.480340 259.364515
Y3*Y3*Y3*y1
34444718.779179
113090682.405554
52660459.247029
101805509.712024
Y3*y1
4520.577531
15267.300631
6571.103114
13334.928551
y1*y2'
3608.088961
3180.598363
6526.763942
11125.883251
state 7
Y3*y1+y1
34444786.835752
113090742.398705
52660582.356295
101805719.570897
y1*y2'*Y3*y1
16310645.885889
55085778.868387
23709124.604420
48113608.497837
state 8
Y3*Y3*Y3*y1+y1+y1*y2'*Y3*y1
50755432.721641
168176521.267091
76369706.960715
149919328.068734
state 9
X= 118597235778948.250000
Do you want calculate y/n?
Press any key and press enter for exit.
Висновок:
В даній лабораторні роботі використовується паралелізм на рівні підзадач, бо кожен блок зі схеми декомпозиції є реалізований у виді функції. Відповідно це середньоблоковий паралелізм.
В результаті виконання даної лабораторної роботи вивчив методи декомпозицій задач. Набув навики розв’язування задач з використанням функціональної декомпозиції.