⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 equation.cpp

📁 求解一元高次方程
💻 CPP
字号:
// #pragma comment(lib,"LIBCD.lib") 
//  #include <stdlib.h>
//  #include <stdio.h>
//  #include <math.h>
//  #include <iostream.h>
//   //求方程的sturm组
//  double* qsturmz(double*P1,int*P2,int n,int* qj)
//  
//  {double  *f1,a1; 
//   double   fL=1.0;
//   int     i,j,k,j2,m;
//   f1=new double[2*(n+1)];   //存放被除式和除式的系数
//   for(i=0;i<=n;i++) *(f1+n+1+i)=*(P1+i);
//   P1=P1+n+1;                //让pl指向f‘(x)的系数
//   m=n;                
//   j=*P2;
//   P2=P2+1;
//   k=*P2;                        //被除式的次数存入j中,除式的次数存入k
//   while(fL>1e-5)
//   { 
//  	for(i=0;i<=j;i++)
//  	{
//        *(f1+i)=*(f1+n+1+i);
//        if(i<j)
//  		  *(f1+n+1+i)=*(P1+i);
//  	}                        //*被除式的系数存入*(fl+i)中,除式的系数存入*(f1+n+1+i)中    
//      *(f1+n+1+j)=0;
//      P1=P1+(m--);                  //让Pl指向余式将要存入的内存区
//      while(j>=k)
//      {
//        if(fabs(*f1)>1e-6)
//  	  {
//  		  a1=*f1;
//        for(i=0;i<=k;i++)
//        *(f1+i)=*(f1+i)-*(f1+n+1+i)*a1/(*(f1+n+1));
//  	  }
//        for(i=1;i<=j;i++)
//        *(f1+i-1)=*(f1+i);
//        *(f1+j)=0;
//         j--;
//  	}
//       while(fabs(*f1)<1e-4&&j>0)
//  	 {
//  		 for(i=1;i<=j;i++)
//           *(f1+i-1)=*(f1+i);
//           *(f1+j)=0;
//           j--;
//  	 }
//       for(fL=0,i=0;i<=j;i++)
//  	 {
//  		 *(P1+i)=-(*(f1+i));           //将余式乘一1存入pl指向的内存区
//           fL=fL+fabs(*(f1+i));
//  	 }
//  	 
//       for(i=j+1;j<=k;j++)
//       *(P1+i)=0;                  //*将P1指向内存区的乘余部分充0
//       *(++P2)=j;               //*将余式的次数j存入P2指向的内存区
//       j2=j;j=k;k=j2;
//   }
//   delete[] f1;
//   P1=P1-(++m);
//   *qj=*(--P2);            //pl指向fs(x),qj存入fs(x)的次数
//   return P1;
//  }
//  
//  求F(x)一f(x)/fs(x)
//  void   fsturmz(double*P1,double*P4,int n,int* qj) 
//  {
//   int     i,j,k,m=n-*qj;
//   double   *f1,a1;
//   f1=new double[n+1];
//   for(i=0;i<=n;i++)
//   *(f1+i)=*(P1+i);           //将f(x)的系数存入fl指向的内存区
//   for(i=0;i<=m;i++)
//   {
//  	 a1=*f1;
//       *(P1+i)=a1/(*P4);         //*p4指向fs(x)
//       for(j=0;j<=*qj;j++)
//       *(f1+j)=*(f1+j)-(*(P4+j))*a1/(*P4);
//       for(k=1;k<=n-i;k++)
//       *(f1+k-1)=*(f1+k);
//       *(f1+n-i)=0;
//   }                       //F(x)的系数存入P1指向的内存区
//   delete[] f1;
//   for(i=m+1;i<=n;i++)
//   *(P1+i)=0;
//   for(i=0;i<=m-1;i++)    //F‘(x)的系数存入(pl+n+1)指向的内存区
//   *(P1+n+1+i)=(m-i)*(*(P1+1));
//   *(P1+n+1+m)=0;
//  }
//  
//  求多项式在x处的变号数v(x)
//  int v(double*P1,int*P2,double x,int n)         
//  {
//   int  i1,i2,i3,i4=0;
//   double *f1;
//   while(*(P2+(++i4))>0);      //求sturm组中多项式的个数
//       f1=new double[i4+1];
//   for(i1=0;i1<=i4;i1++) 
//  	 *(f1+i1)=0;
//   for(i1=0,i2=n+1;i2>=1&&*P2!=-1;i1++,P1=P1+(i2--),P2++)
//   {
//  	 for(*(f1+i1)=*P1,i3=1;i3<=*P2;i3++)   //*求sturm组中各多项式
//       *(f1+i1)=x*(*(f1+i1))+*(P1+i3);
//   }                                 //在x处的函数值*
//   for(i1=0;i1<=i4;i1++)
//   {
//       if(fabs(*(f1+i1))>1e-6)     continue;
//       for(i2=i1;i2<i4;i2++)
//       *(f1+i2)=*(f1+i2+1);
//       *(f1+i4)=0;
//       i4--;
//   }           //二去掉fo(x),fl(x),…,fs(x)中的0
//   for(i2=0,i1=1;i1<=i4;i1++)         //求序列fo(x),fl(x),…,fs(x)的变号数
//   if((*(f1+i1-1))*(*(f1+i1))<0)
//   i2=i2+1;
//   delete[] f1;
//   return  i2;
//  }
//  
//  求根的界
//  double  qgdj(double*P1,int*P2)  
//  {
//   double m;           
//   int   i;
//   m=fabs(*(P1+1));
//   for(i=1;i<*P2;i++)   
//   if(fabs(*(P1+i))>m)
//   m=fabs(*(P1+i));
//   m=1+m/fabs(*P1);
//   return m;
//  }
//  
//  求多项式在x处的函数值
//  double   dxsv(double*P1,int*P2,double x)  
//  {
//   double   f=*P1;
//   int     i;
//   for(i=1;i<=*P2;i++)
//   f=x*f+*(P1+i);
//   return  f;
//  }
//   
//  将包含根的区间分隔为几个小区间
//  void  gdg1(double*P1,int*P2,double b,int n,double* f1,int* kk,int* k2) 
//  {
//   double c;
//   int    k1=0,k3,k4;
//   
//   for(k1=1;k1<*k2;k1++)
//   {
//  	 *(kk+k1)=0;
//       *(f1+k1)=0;
//       *(f1+*k2+k1)=0;
//   }
//   *kk=*k2;
//   *f1=-b;
//   *(f1+*k2)=b;
//   while(1)
//   {
//       for(k1=0;k1<*k2;k1++)
//       if(*(kk+k1)>1)break;   //取一个根的个数大于1的区间
//       if(k1==*k2)break;
//       c=(*(f1+k1)+*(f1+*k2+k1))/2;
//       k3=v(P1,P2,c,n);
//       if(k3==v(P1,P2,*(f1+k1),n))
//           *(f1+k1)=c;
//       else if(k3==v(P1,P2,*(f1+*k2+k1),n))
//           *(f1+*k2+k1)=c;
//       else          //二将区间分隔为两个区间
//  	 {
//  		 for(k4=*k2-1;k4>1;k4--)
//           if(*(kk+k4)==0)break;       //取两个空的单元存放另一区间的端点
//           *(f1+*k2+k4)=*(f1+*k2+k1);
//           *(f1+*k2+k1)=c;
//           *(f1+k4)=c;
//           *(kk+k1)=v(P1,P2,*(f1+k1),n)-v(P1,P2,*(f1+*k2+k1),n);
//           *(kk+k4)=v(P1,P2,*(f1+k4),n)-v(P1,P2,*(f1+*k2+k4),n);
//  	 }
//   }
//  }
//  void main()
//  {
//   int    n,i,*P2,i6;
//   int    *qj=0;
//   int    *k2=0;
//   int    *kk;
//   double  *P1,fk,*P4,a,b,*f1,c;
//   double* qsturmz(double*P1,int*P2,int n,int* qj);
//   void    fsturmz(double*P1,double*P4,int n,int* qj); 
//   int     v(double*P1,int*P2,double x,int n);
//   double  qgdj(double*P1,int*P2);
//   double  dxsv(double*P1,int*P2,double x);
//   void    gdg1(double*P1,int*P2,double b,int n,double* f1,int* kk,int* k2); 
//   printf("请输入方程的次数n=");
//   scanf("%d",&n);
//   P1=new double[(n+1)*(n+2)/2]; //存入sturm组
//   P2=new int[n+1];             //存放sturm组中多项式的次数
//   for(i=0;i<=n;i++)
//   *(P2+i)=-1;
//   printf("请输入方程的%d个系数并以,号间隔\n",n+1);
//   for(i=0;i<=n;i++)
//   {
//  	 scanf("%f",&fk);
//       *(P1+i)=fk;
//   }
//   for(i=0;i<=n-1;i++)
//   *(P1+(n+1)+i)=(n-i)*(*(P1+i));  //f'(x)的系数并存入(pl+n+1)内存区
//   *P2=n;
//   *(P2+1)=n-1;                   //f(x)的次数存入*p2中
//   P4=qsturmz(P1,P2,n,qj);    //p4指向fs(x)
//   if(qj>0)                   //全局变量存入fs(x)的次数
//   {
//  	 fsturmz(P1,P4,n,qj);
//       for(i=0;i<=n;i++)
//       *(P2+i)=-1;
//       *P2=n-*qj;
//       *(P2+1)=n-*qj-1;
//       P4=qsturmz(P1,P2,n,qj);
//   }  
//   b=qgdj(P1,P2);
//   a=-b;
//   i6=v(P1,P2,a,n)-v(P1,P2,b,n); //求(a,b)内根的个数
//   if(i6==0) 
//   {
//  	 printf("此方程没有实根\n");
//  	 return;
//  	// goto loop;
//  	 exit(-1);
//   }
//   printf("此方程有%d个实根它们是:\n",i6);
//   *k2=v(P1,P2,-b,n)-v(P1,P2,b,n);     //求区间内根的个数
//   f1=new double[2*(*k2)];            //存放各小区间的端点
//   kk=new int[*k2];                   //存放各小区间内根的个数
//   gdg1(P1,P2,b,n,f1,kk,k2);         //将(a,b)分隔为i5个小区间
//   for(i=0;i<i6;i++)
//   {
//  	 c=(*(f1+i)+*(f1+i6+i))/2;
//       do
//  	 {
//  		 if(v(P1,P2,*(f1+i),n)-v(P1,P2,c,n)>0)
//  			 *(f1+i6+i)=c;
//          else  
//               *(f1+i)=c;
//          c=(*(f1+i)+*(f1+i6+i))/2;
//  	 }
//  	 while(fabs(dxsv(P1,P2,c))>1e-5);
//       printf("x%d=%9.4f\n",i+1,c);   //求各小区间内的根
//  	 delete[] f1;
//  	 delete[] kk;
//  	 delete[] P1;
//  	 delete[] P2;
//   }
//  
//  /*	loop:;*/
//  }
//  
//  {
//   int    n,i,*P2,i6;
//   int    *qj=0;
//   int    *k2=0;
//   int    *kk;
//   double  *P1,fk,*P4,a,b,*f1,c;
//   double* qsturmz(double*P1,int*P2,int n,int* qj);
//   void    fsturmz(double*P1,double*P4,int n,int* qj); 
//   int     v(double*P1,int*P2,double x,int n);
//   double  qgdj(double*P1,int*P2);
//   double  dxsv(double*P1,int*P2,double x);
//   void    gdg1(double*P1,int*P2,double b,int n,double* f1,int* kk,int* k2); 
//   printf("请输入方程的次数n=");
//   scanf("%d",&n);
//   P1=new double[(n+1)*(n+2)/2]; //存入sturm组
//   P2=new int[n+1];             //存放sturm组中多项式的次数
//   for(i=0;i<=n;i++)
//   *(P2+i)=-1;
//   printf("请输入方程的%d个系数并以,号间隔\n",n+1);
//   for(i=0;i<=n;i++)
//   {
//  	 scanf("%f",&fk);
//       *(P1+i)=fk;
//   }
//   for(i=0;i<=n-1;i++)
//   *(P1+(n+1)+i)=(n-i)*(*(P1+i));  //f'(x)的系数并存入(pl+n+1)内存区
//   *P2=n;
//   *(P2+1)=n-1;                   //f(x)的次数存入*p2中
//   P4=qsturmz(P1,P2,n,qj);    //p4指向fs(x)
//   if(qj>0)                   //全局变量存入fs(x)的次数
//   {
//  	 fsturmz(P1,P4,n,qj);
//       for(i=0;i<=n;i++)
//       *(P2+i)=-1;
//       *P2=n-*qj;
//       *(P2+1)=n-*qj-1;
//       P4=qsturmz(P1,P2,n,qj);
//   }  
//   b=qgdj(P1,P2);
//   a=-b;
//   i6=v(P1,P2,a,n)-v(P1,P2,b,n); //求(a,b)内根的个数
//   if(i6==0) 
//   {
//  	 printf("此方程没有实根\n");
//  	 return;
//  	// goto loop;
//  	 exit(-1);
//   }
//   printf("此方程有%d个实根它们是:\n",i6);
//   *k2=v(P1,P2,-b,n)-v(P1,P2,b,n);     //求区间内根的个数
//   f1=new double[2*(*k2)];            //存放各小区间的端点
//   kk=new int[*k2];                   //存放各小区间内根的个数
//   gdg1(P1,P2,b,n,f1,kk,k2);         //将(a,b)分隔为i5个小区间
//   for(i=0;i<i6;i++)
//   {
//  	 c=(*(f1+i)+*(f1+i6+i))/2;
//       do
//  	 {
//  		 if(v(P1,P2,*(f1+i),n)-v(P1,P2,c,n)>0)
//  			 *(f1+i6+i)=c;
//          else  
//               *(f1+i)=c;
//          c=(*(f1+i)+*(f1+i6+i))/2;
//  	 }
//  	 while(fabs(dxsv(P1,P2,c))>1e-5);
//       printf("x%d=%9.4f\n",i+1,c);   //求各小区间内的根
//  	 delete[] f1;
//  	 delete[] kk;
//  	 delete[] P1;
//  	 delete[] P2;
//   }
//  
//  /*	loop:;*/
//  }
//  
//  P1=new double[(n+1)*(n+2)/2]; //存入sturm组
//  P2=new int[n+1];             //存放sturm组中多项式的次数
//  for(i=0;i<=n;i++)
//  *(P2+i)=-1;
//  printf("请输入方程的%d个系数并以,号间隔\n",n+1);
//  for(i=0;i<=n;i++)
//  {
// 	 scanf("%f",&fk);
//      *(P1+i)=fk;
//  }
//  for(i=0;i<=n-1;i++)
//  *(P1+(n+1)+i)=(n-i)*(*(P1+i));  //f'(x)的系数并存入(pl+n+1)内存区
//  *P2=n;
//  *(P2+1)=n-1;                   //f(x)的次数存入*p2中
//  P4=qsturmz(P1,P2,n,qj);    //p4指向fs(x)
//  if(qj>0)                   //全局变量存入fs(x)的次数
//  {
// 	 fsturmz(P1,P4,n,qj);
//      for(i=0;i<=n;i++)
//      *(P2+i)=-1;
//      *P2=n-*qj;
//      *(P2+1)=n-*qj-1;
//      P4=qsturmz(P1,P2,n,qj);
//  }  
//  b=qgdj(P1,P2);
//  a=-b;
//  i6=v(P1,P2,a,n)-v(P1,P2,b,n); //求(a,b)内根的个数
//  if(i6==0) 
//  {
// 	 printf("此方程没有实根\n");
// 	 return;
// 	// goto loop;
// //	 exit(-1);
//  }
//  printf("此方程有%d个实根它们是:\n",i6);
//  *k2=v(P1,P2,-b,n)-v(P1,P2,b,n);     //求区间内根的个数
//  f1=new double[2*(*k2)];            //存放各小区间的端点
//  kk=new int[*k2];                   //存放各小区间内根的个数
//  gdg1(P1,P2,b,n,f1,kk,k2);         //将(a,b)分隔为i5个小区间
//  for(i=0;i<i6;i++)
//  {
// 	 c=(*(f1+i)+*(f1+i6+i))/2;
//      do
// 	 {
// 		 if(v(P1,P2,*(f1+i),n)-v(P1,P2,c,n)>0)
// 			 *(f1+i6+i)=c;
//         else  
//              *(f1+i)=c;
//         c=(*(f1+i)+*(f1+i6+i))/2;
// 	 }
// 	 while(fabs(dxsv(P1,P2,c))>1e-5);
//      printf("x%d=%9.4f\n",i+1,c);   //求各小区间内的根
// 	 delete[] f1;
// 	 delete[] kk;
// 	 delete[] P1;
// 	 delete[] P2;
//  }
// 
// /*	loop:;*/
// }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -