Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #define N 100
- double A[N][N], F[N], mf, X[N], X1[N], S[N], msf;
- int main(){
- int i, j;
- long int dt;
- double t, e;
- /* Генерация данных. Здесь задается матрица с элементами равными 1,
- * по диагонали равными 2. Матрица берется хорошо обусловленной.
- * При правой части равной N+1 все корни будут равными 1. */
- mf = 0;
- for(i = 0; i < N; i++)
- {
- for(j = 0; j < N; j++)
- (i==j)?(A[i][j]=2):(A[i][j]=1);
- F[i] = N+1;
- /* Сразу вычисляем сумму квадратов элементов вектора F,
- * т.е. подкоренное выражение формулы (4). */
- mf += F[i]*F[i];
- }
- /* Задаем шаг t и e. */
- t = 0.01;
- e = 0.00001;
- /* Задаем начальное приближение корней. В Х1 хранятся значения корней
- * к+1-й итерации. */
- for(i = 0; i < N; i++)
- X1[i] = 0.6;
- #pragma omp parallel
- do{
- #pragma omp for
- for(i = 0; i < N; i++)
- /* В Х хранятся значения корней к-й итерации. */
- X[i] = X1[i];
- msf=0;
- #pragma omp for reduction(+ : msf) private(j)
- for(i = 0; i < N; i++){
- S[i] = 0;
- #pragma omp for
- for(j = 0; j < N; j++)
- S[i] += A[i][j] * X[j];
- X1[i] = X[i] - t*(S[i] - F[i]);
- msf += (S[i] - F[i])*(S[i] - F[i]);
- }
- }while(msf/mf > e*e); /* Проверка условия по формуле (3). */
- /* Для контроля выводим 4-е первых корня */
- for(i = 0; i < 4; i++)
- printf(" %f\n",X[i]);
- return(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment