Advertisement
Guest User

Untitled

a guest
Oct 17th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.08 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include "task3.h"
  5.  
  6. double *inv(const int N, const double *M) {
  7.     int i,j, k;
  8.     double xil, xjl;
  9.     double sinfi, cosfi, somebodythatiusedtoknow;
  10.     double *invm;
  11.     double *adjointm;
  12. //    double *Tij;
  13.     invm = (double*) malloc(N*N*sizeof(double));
  14.     adjointm = (double*) malloc(2*N*N*sizeof(double));
  15. //    Tij = (double*) malloc(N*N*sizeof(double));
  16.     for (i=0; i<N; ++i){
  17.         for (j=0; j<N; ++j){
  18.             adjointm[i*2*N+j] = M[i*N+j];
  19.         }
  20.         j=N;
  21.         for (j=N; j<N+i; ++j){
  22.             adjointm[i*2*N+j] = 0;
  23.         }
  24.         adjointm[i*2*N+N+i] = 1;
  25.         j = N+i+1;
  26.         for (j=N+i+1; j<2*N; ++j){
  27.             adjointm[i*2*N+j] = 0;
  28.         }
  29.     }
  30.     i=0;
  31.     j=0;
  32.     for (i=0; i <N-1; ++i){
  33.         for (j=i+1; j<N; ++j){
  34.             //находим матрицу Tij
  35.             if(((adjointm[i*2*N+i])<0) || ((adjointm[i*2*N+i])>0) || ((adjointm[j*2*N+i])<0) || ((adjointm[j*2*N+i])>0)){
  36.             cosfi = adjointm[i*2*N+i]/(sqrt((adjointm[i*2*N+i])*(adjointm[i*2*N+i])+(adjointm[j*2*N+i])*(adjointm[j*2*N+i])));
  37.             sinfi = adjointm[j*2*N+i]/(sqrt((adjointm[i*2*N+i])*(adjointm[i*2*N+i])+(adjointm[j*2*N+i])*(adjointm[j*2*N+i])));
  38. /*            printf("cosfi = %f, sinfi = %f\n",cosfi, sinfi);*/
  39. //            Tij[i*N+i] = M[i*N+i]/sqrt((M[i*N+i])*(M[i*N+i])+(M[j*N+i])*(M[j*N+i]));
  40. //            printf("%f ", adjointm[i*2*N+j]);
  41. //            Tij[j*N+j] = M[i*N+i]/sqrt((M[i*N+i])*(M[i*N+i])+(M[j*N+i])*(M[j*N+i]));
  42. //            Tij[i*N+j] = -M[j*N+i]/sqrt((M[i*N+i])*(M[i*N+i])+(M[j*N+i])*(M[j*N+i]));
  43. //            Tij[j*N+i] = M[j*N+i]/sqrt((M[i*N+i])*(M[i*N+i])+(M[j*N+i])*(M[j*N+i]));
  44. //            for(k=0; k<N; ++k){
  45. //                for(l=0; l<N; ++l){
  46. //                    if (((k*N+l)!=(i*N+i)) && ((k*N+l)!=(i*N+j)) && ((k*N+l)!=(j*N+j)) && ((k*N+l)!=(j*N+i))){
  47. //                        if(k==l){
  48. //                            Tij[k*N+l] = 1;
  49. //                        }
  50. //                        else{
  51. //                            Tij[k*N+l] = 0;
  52. //                        }
  53. //                    }
  54. //                }
  55. //            }
  56. //            k=0;
  57. //            l=0;
  58.             //приводим M к треугольному виду
  59.             for(k=0; k<(2*N); ++k){
  60.                     xil = adjointm[i*2*N+k];
  61.                     xjl = adjointm[j*2*N+k];
  62.                     adjointm[i*2*N+k] = xil*cosfi+xjl*sinfi;
  63.                     adjointm[j*2*N+k] = -xil*sinfi+xjl*cosfi;
  64.             }
  65.             k=0;
  66.             }
  67.         }
  68.     }
  69. /*    for (i=0; i<N; ++i){
  70.         for (j=0; j<2*N; ++j){
  71.             printf("%f ", adjointm[i*2*N+j]);
  72.         }
  73.         printf("\n");
  74.     }
  75.     printf("\n");*/
  76.     i=0;
  77.     j=0;
  78.     k=0;
  79.     //ищем обратную
  80.     if((adjointm[(N-1)*2*N+N-1]<=0) && (adjointm[(N-1)*2*N+N-1]>=0)){
  81.         for (i=0; i<N; ++i){
  82.             for (j=0; j<N; ++j){
  83.                 invm[i*N+j] = 0;
  84. //                printf("%f ", adjointm[i*2*N+j]);
  85.             }
  86.         }
  87.         return invm;
  88.     }
  89.     for (i=N-2; i>=0; --i){
  90.         for (k=i; k>=0; --k){
  91.             for (j=0; j!= 2*N; ++j){
  92.                 if((adjointm[k*2*N+i+1]>0) || (adjointm[k*2*N+i+1]<0)){
  93.                 adjointm[k*2*N+j]=adjointm[k*2*N+j]-adjointm[(i+1)*2*N+j]*adjointm[k*2*N+i+1]/adjointm[(i+1)*2*N+i+1];
  94.                 }
  95.             }
  96.         }
  97.         /*for(k=0;k<N;++k){
  98.             for(j=0;j<2*N;++j){
  99.                 printf("%f ", adjointm[i*2*N+j]);
  100.             }
  101.             printf("\n");
  102.         }
  103.         printf("\n\n");*/
  104.     }
  105.     for(i=0;i<N;++i){
  106.         if((adjointm[i*2*N+i]<1)||(adjointm[i*2*N+i]>1)){
  107.                  somebodythatiusedtoknow = adjointm[i*2*N+i];
  108.                  for(k=i;k!=2*N;++k){
  109.                      adjointm[i*2*N+k]=adjointm[i*2*N+k]/somebodythatiusedtoknow;
  110.                  }
  111.         }
  112.     }
  113.     i=0;
  114.     j=0;
  115.     for (i=0; i<N; ++i){
  116.         for (j=0; j<N; ++j){
  117.             invm[i*N+j] = adjointm[i*2*N+j+N];
  118.         }
  119.     }
  120.     return invm;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement