Advertisement
Guest User

Untitled

a guest
Oct 16th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.38 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <math.h>
  4. #include <fstream>
  5.  
  6. using namespace std;
  7.  
  8. const int N = 2;
  9.  
  10. double ** mem_ar(int n, int m)
  11. {
  12. double **ar = new double *[n];
  13. if (ar==0)
  14. {
  15. cout << "ar==0";
  16. exit( -1);
  17. }
  18. for (int i=0; i<n; i++)
  19. {
  20. ar[i] = new double [m];
  21. if (ar[i]==0)
  22. {
  23. cout << "ar[i]==0";
  24. exit( -2);
  25. }
  26. }
  27. return ar;
  28. }
  29.  
  30. void mem_del(double** ar,int r)
  31. {
  32. for (int i=0; i<r; i++)
  33. delete [ ] ar[i];
  34. delete [ ] ar;
  35. return;
  36. }
  37.  
  38. void gauss(double** ar, double *b, double* x, int r)
  39. {
  40. // double eps = 1e-006;
  41. int k=0;
  42. while (k<r)
  43. {
  44. double maxx = fabs(ar[k][k]);
  45. int index = k;
  46. for (int i=k+1; i<r; i++)
  47. {
  48. if (fabs(ar[i][k])>maxx)
  49. {
  50. maxx = fabs(ar[i][k]);
  51. index = i;
  52. }
  53. }
  54. // if (maxx < eps) return;
  55. double temp;
  56. if (index!=k)
  57. {
  58. for (int i=k; i<r; i++)
  59. {
  60. temp = ar[index][i];
  61. ar[index][i] = ar[k][i];
  62. ar[k][i] = temp;
  63. }
  64. temp = b[index];
  65. b[index] = b[k];
  66. b[k] = temp;
  67. }
  68. for (int i=k; i<r; i++)
  69. {
  70. b[i] /= ar[i][k];
  71. for (int j=r-1; j>=k; j--)
  72. {
  73. ar[i][j] /= ar[i][k];
  74. }
  75. if (i==k) continue;
  76. for (int j=k; j<r; j++)
  77. {
  78. ar[i][j] = ar[i][j]-ar[k][j];
  79. }
  80. b[i] = b[i]-b[k];
  81. }
  82. k++;
  83. }
  84. for (int i=r-1; i>=0; i--)
  85. {
  86. x[i]=b[i];
  87. for (int j=0; j<i; j++)
  88. b[j]=b[j]-ar[j][i]*x[i];
  89. }
  90. return;
  91. }
  92.  
  93. void vvod_ar(double* ar, int r)
  94. {
  95. for (int i=0; i<r; i++)
  96. {
  97. cin >> ar[i];
  98. }
  99. return;
  100. }
  101.  
  102. void phuncc(double* x, double* f)
  103. {
  104. f[0]=sin(x[0])-x[1]-1.32;
  105. f[1]=cos(x[1])-x[0]+0.85;
  106. return;
  107. }
  108.  
  109. void jakobi(double* x, double** j)
  110. {
  111. j[0][0]=-cos(x[0]);
  112. j[0][1]=1;
  113. j[1][0]=1;
  114. j[1][1]=sin(x[1]);
  115. return;
  116. }
  117.  
  118. void newton(double* x, double e1, double e2, int N)
  119. {
  120. double* f = new double [N];
  121. double** j = mem_ar(N,N);
  122. double* dx = new double [N];
  123. double* xx = new double [N];
  124. double d1,d2,d21,d22;
  125. int k=1;
  126. do
  127. {
  128. phuncc(x,f);
  129. jakobi(x,j);
  130. gauss(j,f,dx,N);
  131. for (int i=0; i<N; i++)
  132. {
  133. xx[i]=x[i]+dx[i];
  134. }
  135. d1=(fabs(f[0])>fabs(f[1])?fabs(f[0]):fabs(f[1]));
  136. d21=(fabs(xx[0])<1?fabs(xx[0]-x[0]):fabs((xx[0]-x[0])/xx[0]));
  137. d22=(fabs(xx[1])<1?fabs(xx[1]-x[1]):fabs((xx[1]-x[1])/xx[1]));
  138. d2=(d21>d22?d21:d22);
  139. cout << k << ' ' << setprecision(12) << d1 << ' ' << setprecision(12) << d2 << endl;
  140. for (int i=0; i<N; i++)
  141. {
  142. x[i]=xx[i];
  143. }
  144. } while ((d1>e1)&&(d2>e2));
  145. return;
  146. }
  147.  
  148. void solv_out(double* x, int r)
  149. {
  150. for (int i=0; i<r; i++)
  151. cout << setw(7) << setprecision(3) << x[i];
  152. cout << endl;
  153. return;
  154. }
  155.  
  156. int main()
  157. {
  158. double e1, e2;
  159. e1=1e-009; e2=1e-009;
  160. double* x = new double [N];
  161. vvod_ar(x,N);
  162. newton(x,e1,e2,N);
  163. solv_out(x,N);
  164. return 0;
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement