main.cpp
上传用户:jinqiu1010
上传日期:2021-09-06
资源大小:3082k
文件大小:6k
开发平台:

C/C++

  1. // main.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include <stdio.h>
  7. #define n 4
  8. #define N (2*n)
  9. /*************************求逆*********************/
  10. float *inv(float *a,int x)
  11. int *is,*js,i,j,k,l,u,v;
  12.     float d,p;
  13.     is=(int*)malloc(x*sizeof(int));
  14.     js=(int*)malloc(x*sizeof(int));
  15.     for (k=0; k<=x-1; k++)
  16.       { d=0.0;
  17.         for (i=k; i<=x-1; i++)
  18.         for (j=k; j<=x-1; j++)
  19.           { l=i*x+j; p=fabs(a[l]);
  20.             if (p>d) { d=p; is[k]=i; js[k]=j;}
  21.           }
  22.         if (d+1.0==1.0)
  23.           { free(is); free(js); printf("err**not invn");
  24.             return NULL;
  25.           }
  26.         if (is[k]!=k)
  27.           for (j=0; j<=x-1; j++)
  28.             { u=k*x+j; v=is[k]*x+j;
  29.               p=a[u]; a[u]=a[v]; a[v]=p;
  30.             }
  31.         if (js[k]!=k)
  32.           for (i=0; i<=x-1; i++)
  33.             { u=i*x+k; v=i*x+js[k];
  34.               p=a[u]; a[u]=a[v]; a[v]=p;
  35.             }
  36.         l=k*x+k;
  37.         a[l]=1.0/a[l];
  38.         for (j=0; j<=x-1; j++)
  39.           if (j!=k)
  40.             { u=k*x+j; a[u]=a[u]*a[l];}
  41.         for (i=0; i<=x-1; i++)
  42.           if (i!=k)
  43.             for (j=0; j<=x-1; j++)
  44.               if (j!=k)
  45.                 { u=i*x+j;
  46.                   a[u]=a[u]-a[i*x+k]*a[k*x+j];
  47.                 }
  48.         for (i=0; i<=x-1; i++)
  49.           if (i!=k)
  50.             { u=i*x+k; a[u]=-a[u]*a[l];}
  51.       }
  52.     for (k=x-1; k>=0; k--)
  53.       { if (js[k]!=k)
  54.           for (j=0; j<=x-1; j++)
  55.             { u=k*x+j; v=js[k]*x+j;
  56.               p=a[u]; a[u]=a[v]; a[v]=p;
  57.             }
  58.         if (is[k]!=k)
  59.           for (i=0; i<=x-1; i++)
  60.             { u=i*x+k; v=i*x+is[k];
  61.               p=a[u]; a[u]=a[v]; a[v]=p;
  62.             }
  63.       }
  64.     free(is); free(js);
  65.     return a;
  66. }
  67. void display(float M[],int x) /*显示结果*/
  68. int i,j;
  69. float *result=NULL,*A=NULL;
  70. /*显示原矩阵*/
  71. printf("nn转置前矩阵为:n");
  72.      for(i=0;i<x;i++)
  73. {
  74.    for(j=0;j<x;j++)
  75.    {   
  76.     printf("%10.4ft", M[i*x+j]);
  77.     
  78.    }
  79.       printf("n");
  80. }
  81.      
  82. A=(float*)malloc(x*x*sizeof(float));
  83. for(i=0;i<x*x;i++) A[i]=M[i];
  84. result=inv(A,N);
  85. if(result!=NULL)
  86. {
  87.    printf("nn转置后矩阵为:n");
  88.    for(i=0;i<x;i++)
  89.    {
  90.    for(j=0;j<x;j++)
  91.    {   
  92.    M[i*x+j]=result[i*x+j];
  93.     printf("%10.4ft", M[i*x+j]);
  94.     
  95.    }
  96.       printf("n");
  97.    }
  98. }
  99. else
  100. {
  101.    printf("The Matrix is singular ! Can't be inverse!n");
  102. }
  103. free(A);
  104. }
  105. #include <conio.h>
  106. /* Test */
  107. /**********************************************************/
  108. float absu(float x)
  109. {
  110. if(x>=0)
  111. return x;
  112. else 
  113. return (0-x);
  114. }
  115. int main(int argc, char* argv[])
  116. {
  117.     float P[n]={0},p[n],p1[n];
  118. float Q[n]={0},q[n],q1[n];
  119. float im[n],re[n];
  120. float e[n+1]={0};
  121.     float f[n+1]={0};
  122.      int i,j,k;
  123.   float sum1=0.0;
  124. float sum2=0.0;
  125. int s=1;
  126.  float G[n+1][n+1],B[n+1][n+1];
  127.      float a,b,sump,sumq;
  128.  float Jac[2*n][2*n];
  129.  float result[2*n],res[N];
  130. printf("n步骤一:录入导纳!nn平衡节点默认为最后节点,不进行录入!!nn");
  131. printf("输入电导,行优先:n");
  132. for(i=0;i<n+1;i++)
  133. for(j=i;j<n+1;j++)
  134. {
  135. scanf("%f",&G[i][j]);
  136. G[j][i]=G[i][j];
  137. }
  138. for(i=0;i<n+1;i++)
  139. {
  140. for(j=0;j<n+1;j++)
  141. {
  142. printf("%10.4ft",G[i][j]);
  143. //printf("  ");
  144. }
  145. printf("n");
  146. }
  147. printf("n输入电纳:n");
  148. for(i=0;i<n+1;i++)
  149. for(j=i;j<n+1;j++)
  150. {
  151. scanf("%f",&B[i][j]);
  152. B[j][i]=B[i][j];
  153. }
  154. for(i=0;i<n+1;i++)
  155. {
  156. for(j=0;j<n+1;j++)
  157. {
  158. printf("%10.4ft",B[i][j]);
  159. }
  160. printf("n");
  161. }
  162. printf("n节点导纳矩阵为:n");
  163. for(i=0;i<n+1;i++)
  164. {
  165. for(j=0;j<n+1;j++)
  166. {
  167. printf("%f+j%f",G[i][j],B[i][j]);
  168. printf("  ");
  169. }
  170. printf("n");
  171. }
  172. printf("nn");
  173. printf("步骤二:计算deta P,deta Q:nn");
  174. printf("请输入P:n");
  175. for(i=0;i<n;i++)
  176. scanf("%f",&p1[i]);
  177. printf("请输入Q:n");
  178. for(i=0;i<n;i++)
  179. scanf("%f",&q1[i]);
  180. printf("请输入e:n");
  181. for(i=0;i<n+1;i++)
  182. scanf("%f",&e[i]);
  183. printf("请输入f:n");
  184. for(i=0;i<n+1;i++)
  185. scanf("%f",&f[i]);
  186. while(1)
  187. {
  188. printf("nn第%d次迭代nn",s);
  189.    for(i=0;i<n;i++)
  190. {sump=0;
  191. sumq=0;
  192. a=1;
  193. b=1;
  194. for(j=0;j<n+1;j++)
  195. {   
  196. a=G[i][j]*e[j]-B[i][j]*f[j];
  197.         b=G[i][j]*f[j]+B[i][j]*e[j];
  198. sump=sump+e[i]*a+f[i]*b;
  199. sumq=sumq+f[i]*a-e[i]*b;
  200. }
  201. p[i]=sump;
  202. q[i]=sumq;
  203. P[i]=p1[i]-sump;
  204. Q[i]=q1[i]-sumq;
  205. }
  206. printf("deP,deQ分别为:n");
  207. for(i=0;i<n;i++)
  208. {
  209. printf("P[%d]=%f",i,P[i]);
  210. printf("  ");
  211. }
  212. printf("n");
  213.     for(i=0;i<n;i++)
  214. {
  215. printf("Q[%d]=%f",i,Q[i]);
  216. printf("  ");
  217. }
  218. printf("nP,Q分别为:n");
  219. for(i=0;i<n;i++)
  220. {
  221. printf("p[%d]=%f",i,p[i]);
  222. printf("  ");
  223. }
  224. printf("n");
  225.     for(i=0;i<n;i++)
  226. {
  227. printf("q[%d]=%f",i,q[i]);
  228. printf("  ");
  229. }
  230.                  
  231. for(k=0;k<n;k++)
  232. {   
  233. sum1=e[k]*e[k]+f[k]*f[k];
  234. re[k]=(p[k]*e[k]-q[k]*f[k])/sum1;
  235. im[k]=(p[k]*f[k]+q[k]*e[k])/sum1;
  236. }
  237. printf("n电流为:nn");
  238. for(k=0;k<n;k++)
  239. printf("I[%d]=%f+j%f ",k,re[k],im[k]);
  240. printf("n步骤三:计算Jaccobi矩阵:nn");
  241.      for(i=0;i<n;i++)
  242. {
  243. for(j=0;j<n;j++)
  244. {
  245. if(j!=i)
  246. {
  247. float a=0.0,b=0.0;
  248. a=(G[i][j]*e[i]+B[i][j]*f[i]);
  249. b=(B[i][j]*e[i]-G[i][j]*f[i]);
  250. Jac[2*i][2*j]=a;
  251. Jac[2*i][2*j+1]=0-b;
  252. Jac[2*i+1][2*j]=0-b;
  253. Jac[2*i+1][2*j+1]=0-a;
  254. }
  255. else
  256. {
  257.                    Jac[2*i][2*j]=re[i]+G[i][i]*e[i]+B[i][i]*f[i];
  258.    Jac[2*i][2*j+1]=0.0-B[i][i]*e[i]+G[i][i]*f[i]-im[i];
  259.     Jac[2*i+1][2*j]=0.0-B[i][i]*e[i]+G[i][i]*f[i]+im[i];
  260.    Jac[2*i+1][2*j+1]=0.0-G[i][i]*e[i]-B[i][i]*f[i]+re[i];
  261. }
  262. }
  263. }
  264.               printf("nJaccobi矩阵是:n");
  265.              for(i=0;i<2*n;i++)
  266.  {
  267.               for(j=0;j<2*n;j++)
  268.   {
  269.              printf("%10.4ft",Jac[i][j]);
  270.             //printf("      ");
  271.   }
  272.                 printf("n");
  273.  }
  274.      printf("对Jaccobi矩阵处理nn");
  275.   for(i=0;i<n;i++)
  276.   {
  277.   res[2*i]=P[i];
  278.   res[2*i+1]=Q[i];
  279.   }
  280.      for(i=0;i<2*n;i++)
  281.  {
  282.               
  283.              printf("%f",res[i]);
  284.             printf("  ");
  285.   }
  286.                
  287.      printf("n第四步:计算Jaccobi阵列nn");
  288.      display(Jac[0],N);
  289.     for(i=0;i<N;i++)
  290. {
  291. sum2=0.0;
  292. for(j=0;j<N;j++)
  293. sum2=sum2+Jac[i][j]*res[j];
  294. result[i]=sum2;
  295. }
  296.  printf("n电压值为:nn");
  297.  for(i=0;i<n;i++)
  298.  {e[i]=e[i]+result[2*i];
  299.  f[i]=f[i]+result[2*i+1];
  300.  printf("%f+j%f  ",e[i],f[i]);
  301.  }
  302.      if(absu(result[0])<0.00001||(getchar()=='o'))
  303.  break;
  304.   
  305.  s++;
  306. }
  307. return 0;
  308. }