Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- najwiekszy moduł:
- wyjście: lamba, x, N
- zbieżność ?
- N = f (eps)
- czy zbieżność zależy od y0
- Kryłow: - rozmiar n
- y0,..,yn -> ukl. rownan -> p1,...,pn -> r char -> lamba -> X
- najlepiej Gauss/Kramer
- A = [2 -2 3; 1 1 1; 1 3 -1];
- B - [3 -4 3; -4 6 3; 3 3 1];
- C = [3 30 -48; 3 14 -24; 3 15 -25];
- ROZWIAZANIE ANALITYCZNE BY WOLFRAM!
- */
- #include <iostream>
- #include <cmath>
- #include <vector>
- using namespace std;
- int main()
- {
- const int n = 3; // Rzad macierzy
- float A[n][n]={{1,1,1},{1,2,3},{1,3,6}};
- vector<float*> Y;
- vector<float> lambda;
- float *y0 = new float[n];
- y0[0] = 1;
- for(int i=1;i<n;i++)
- y0[i] = 0;
- Y.push_back(y0);
- lambda.push_back(INT_MAX);
- while(1)
- {
- float* yp = Y[Y.size()-1]; //wektor y poprzedni
- float* y = new float[n]; //nowy wektor y
- float eps = 0.001;
- for(int i=0;i<n;i++)
- y[i] = 0;
- //cout<<"y"<<Y.size()<<": [";
- for(int i=0;i<n;i++)
- {
- for(int j=0;j<n;j++)
- y[i] += A[i][j]*yp[j];
- // cout<<y[i]<<' ';
- }
- //cout<<"]\n";
- Y.push_back(y);
- float l = 0;
- for(int i=0;i<n;i++)
- if(yp[i] == 0)
- {
- l = INT_MAX;
- break;
- }
- else
- l+=y[i]/yp[i]/n;
- lambda.push_back(l);
- if(l != INT_MAX)
- if(abs( lambda[lambda.size() - 2] - l) < eps)
- break;
- }
- float l = lambda[lambda.size() - 1];
- float* y = Y[Y.size() - 1];
- float max = y[0];
- for(int i=1;i<n;i++)
- max = (max > y[i] ? max : y[i]);
- cout<<"Iteracji: "<<lambda.size()-1<<" Lambda: "<<l<<"\nx=["; // -1 iteracji, poniewaz w tabeli jest y0
- for(int i=0;i<n;i++)
- cout<<y[i]/max<<' ';
- cout<<"]\n";
- for(int i=0;i<Y.size();i++)
- delete[] Y[i];
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement