Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- #include <math.h>
- #include <fstream>
- using namespace std;
- const int N = 2;
- double ** mem_ar(int n, int m)
- {
- double **ar = new double *[n];
- if (ar==0)
- {
- cout << "ar==0";
- exit( -1);
- }
- for (int i=0; i<n; i++)
- {
- ar[i] = new double [m];
- if (ar[i]==0)
- {
- cout << "ar[i]==0";
- exit( -2);
- }
- }
- return ar;
- }
- void mem_del(double** ar,int r)
- {
- for (int i=0; i<r; i++)
- delete [ ] ar[i];
- delete [ ] ar;
- return;
- }
- void gauss(double** ar, double *b, double* x, int r)
- {
- // double eps = 1e-006;
- int k=0;
- while (k<r)
- {
- double maxx = fabs(ar[k][k]);
- int index = k;
- for (int i=k+1; i<r; i++)
- {
- if (fabs(ar[i][k])>maxx)
- {
- maxx = fabs(ar[i][k]);
- index = i;
- }
- }
- // if (maxx < eps) return;
- double temp;
- if (index!=k)
- {
- for (int i=k; i<r; i++)
- {
- temp = ar[index][i];
- ar[index][i] = ar[k][i];
- ar[k][i] = temp;
- }
- temp = b[index];
- b[index] = b[k];
- b[k] = temp;
- }
- for (int i=k; i<r; i++)
- {
- b[i] /= ar[i][k];
- for (int j=r-1; j>=k; j--)
- {
- ar[i][j] /= ar[i][k];
- }
- if (i==k) continue;
- for (int j=k; j<r; j++)
- {
- ar[i][j] = ar[i][j]-ar[k][j];
- }
- b[i] = b[i]-b[k];
- }
- k++;
- }
- for (int i=r-1; i>=0; i--)
- {
- x[i]=b[i];
- for (int j=0; j<i; j++)
- b[j]=b[j]-ar[j][i]*x[i];
- }
- return;
- }
- void vvod_ar(double* ar, int r)
- {
- for (int i=0; i<r; i++)
- {
- cin >> ar[i];
- }
- return;
- }
- void phuncc(double* x, double* f)
- {
- f[0]=sin(x[0])-x[1]-1.32;
- f[1]=cos(x[1])-x[0]+0.85;
- return;
- }
- void jakobi(double* x, double** j)
- {
- j[0][0]=-cos(x[0]);
- j[0][1]=1;
- j[1][0]=1;
- j[1][1]=sin(x[1]);
- return;
- }
- void newton(double* x, double e1, double e2, int N)
- {
- double* f = new double [N];
- double** j = mem_ar(N,N);
- double* dx = new double [N];
- double* xx = new double [N];
- double d1,d2,d21,d22;
- int k=1;
- do
- {
- phuncc(x,f);
- jakobi(x,j);
- gauss(j,f,dx,N);
- for (int i=0; i<N; i++)
- {
- xx[i]=x[i]+dx[i];
- }
- d1=(fabs(f[0])>fabs(f[1])?fabs(f[0]):fabs(f[1]));
- d21=(fabs(xx[0])<1?fabs(xx[0]-x[0]):fabs((xx[0]-x[0])/xx[0]));
- d22=(fabs(xx[1])<1?fabs(xx[1]-x[1]):fabs((xx[1]-x[1])/xx[1]));
- d2=(d21>d22?d21:d22);
- cout << k << ' ' << setprecision(12) << d1 << ' ' << setprecision(12) << d2 << endl;
- for (int i=0; i<N; i++)
- {
- x[i]=xx[i];
- }
- } while ((d1>e1)&&(d2>e2));
- return;
- }
- void solv_out(double* x, int r)
- {
- for (int i=0; i<r; i++)
- cout << setw(7) << setprecision(3) << x[i];
- cout << endl;
- return;
- }
- int main()
- {
- double e1, e2;
- e1=1e-009; e2=1e-009;
- double* x = new double [N];
- vvod_ar(x,N);
- newton(x,e1,e2,N);
- solv_out(x,N);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement