//************************************************************************* double polinom(int n,double x,double *k) // x^n+k[n-1]*x^(n-1)+k[n-2]*x^(n-2)+...+k[1]*x+k[0] // , { double s=1; for(int i=n-1;i>=0;i--) s=s*x+k[i]; return s; }//polinom // , double dihot(int degree,double edgeNegativ,double edgePositiv,double *kf) { for(;;) {// double x=0.5*(edgeNegativ+edgePositiv); if(x==edgeNegativ||x==edgePositiv)return x; if(polinom(degree,x,kf)<0)edgeNegativ=x; else edgePositiv=x; }// }//dihot // void stepUp( int level, // double **A, // double **B, // int *currentRootsCount // ) { // , double major=0; for(int i=0;i<level;i++) {// major double s=fabs(A[level][i]); if(s>major)major=s; }// major major+=1.0; currentRootsCount[level]=0; // // //A[level][0]+A[level][1]*x+...+A[level][level-1]*x^(level-1)+x^level=0 // for(int i=0;i<=currentRootsCount[level-1];i++) {// //signLeft signRight - A- int signLeft,signRight; // double edgeLeft,edgeRight; // , double edgeNegativ,edgePositiv; // if(i==0)edgeLeft=-major; else edgeLeft=B[level-1][i-1]; // A- double rb=polinom(level,edgeLeft,A[level]); if(rb==0) {// B[level][currentRootsCount[level]]=edgeLeft; currentRootsCount[level]++; continue; }// // A- if(rb>0)signLeft=1;else signLeft=-1; // if(i==currentRootsCount[level-1])edgeRight=major; else edgeRight=B[level-1][i]; // A- rb=polinom(level,edgeRight,A[level]); if(rb==0) {// B[level][currentRootsCount[level]]=edgeRight; currentRootsCount[level]++; continue; }// // A- if(rb>0)signRight=1;else signRight=-1; // , // if(signLeft==signRight)continue; // if(signLeft<0){edgeNegativ=edgeLeft;edgePositiv=edgeRight;} else {edgeNegativ=edgeRight;edgePositiv=edgeLeft;} // B[level][currentRootsCount[level]]=dihot(level,edgeNegativ,edgePositiv,A[level]); currentRootsCount[level]++; }// return; }//stepUp // void polynomRealRoots( int n, // double *kf, // double *rootsArray, // int &rootsCount // ) { // A B, //A B // A- , // //A[n] - //B[n] - //A[n-1] - //B[n-1] - // //A[n-2] B[n-2] - // A[1] - // // B[1] - , // // double **A=new double *[n+1]; double **B=new double *[n+1]; // A- int *currentRootsCount=new int[n+1]; for(int i=1;i<=n;i++) { A[i]=new double[i]; B[i]=new double[i]; } // for(int i=0;i<n;i++)A[n][i]=kf[i]/kf[n]; // A- for(int i1=n,i=n-1;i>0;i1=i,i--) { for(int j1=i,j=i-1;j>=0;j1=j,j--) { A[i][j]=A[i1][j1]*j1/i1; } } // currentRootsCount[1]=1; B[1][0]=-A[1][0]; // for(int i=2;i<=n;i++)stepUp(i,A,B,currentRootsCount); // rootsCount=currentRootsCount[n]; for(int i=0;i<rootsCount;i++)rootsArray[i]=B[n][i]; // for(int i=1;i<=n;i++) { delete[]A[i]; delete[]B[i]; } delete[]A; delete[]B; delete[]currentRootsCount; return; }//polynomRealRoots //*************************************************************************
//************************************************************************* // void polynomRealRoots(int n,double *kf,double *rootsArray,int &rootsCount); //**
************************************************** *********************The real root of a polynomial is always in the region of a monotonic change of the polynomial, between the roots of the derived polynomial.
But a polynomial derivative is also a polynomial, however, of a lesser degree and, having found its real roots, one must look for the roots of the original polynomial between the roots of the derived method of dividing in half.
Source: https://habr.com/ru/post/303342/
All Articles