AlexMatveev

Untitled

May 7th, 2013
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.72 KB | None | 0 0
  1. #include<stdio.h>
  2.  
  3. #define N 100
  4.  
  5. double A[N][N], F[N], mf, X[N], X1[N], S[N], msf;
  6.  
  7. int main(){
  8. int i, j;
  9. long int dt;
  10. double t, e;
  11. /* Генерация данных. Здесь задается матрица с элементами равными 1,
  12. * по диагонали равными 2. Матрица берется хорошо обусловленной.
  13. * При правой части равной N+1 все корни будут равными 1. */
  14. mf = 0;
  15. for(i = 0; i < N; i++)
  16. {
  17. for(j = 0; j < N; j++)
  18. (i==j)?(A[i][j]=2):(A[i][j]=1);
  19. F[i] = N+1;
  20. /* Сразу вычисляем сумму квадратов элементов вектора F,
  21. * т.е. подкоренное выражение формулы (4). */
  22. mf += F[i]*F[i];
  23. }
  24.  
  25. /* Задаем шаг t и e. */
  26. t = 0.01;
  27. e = 0.00001;
  28.  
  29. /* Задаем начальное приближение корней. В Х1 хранятся значения корней
  30. * к+1-й итерации. */
  31. for(i = 0; i < N; i++)
  32. X1[i] = 0.6;
  33. #pragma omp parallel
  34. do{
  35. #pragma omp for
  36. for(i = 0; i < N; i++)
  37. /* В Х хранятся значения корней к-й итерации. */
  38. X[i] = X1[i];
  39.  
  40. msf=0;
  41.  
  42. #pragma omp for reduction(+ : msf) private(j)
  43. for(i = 0; i < N; i++){
  44. S[i] = 0;
  45. #pragma omp for
  46. for(j = 0; j < N; j++)
  47. S[i] += A[i][j] * X[j];
  48. X1[i] = X[i] - t*(S[i] - F[i]);
  49. msf += (S[i] - F[i])*(S[i] - F[i]);
  50. }
  51.  
  52. }while(msf/mf > e*e); /* Проверка условия по формуле (3). */
  53.  
  54. /* Для контроля выводим 4-е первых корня */
  55. for(i = 0; i < 4; i++)
  56. printf(" %f\n",X[i]);
  57. return(0);
  58. }
Advertisement
Add Comment
Please, Sign In to add comment