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

📄 最佳一致逼近多项式.cpp

📁 数值分析中最常用的14个程序: 01_N皇后问题 01_循环赛程表 02_分段线性插值 02_牛顿插值法 03_构造正交多项式 03_最佳一致逼近多项式 04_简单迭代法求方程根[1
💻 CPP
字号:
// 最佳一致逼近多项式.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "math.h"
#include "iostream.h"

  
void bua(double a,double b,double p[],int n,double e,double (*f)(double))
{ 
	int i,j,k,m;
    double x[21],g[21],d,t,u,s,xx,x0,h,yy;
    if (n>20) n=20;		//最高逼近19次
    m=n+1; d=1.0e+35;
    for (k=0; k<=n; k++)	//初始点采集n+1阶切比雪夫多项式的交错点组
      { 
		t=cos((n-k)*3.1415926/(1.0*n));
        x[k]=(b+a+(b-a)*t)/2.0;
      }
    while (1==1)	//迭代
      { u=1.0;
        for (i=0; i<=m-1; i++)		//计算f(x)及(-1)u
          { p[i]=(*f)(x[i]);
            g[i]=-u;
			u=-u;
          }
        for (j=0; j<=n-1; j++)		//确定参考偏差u
          { 
			k=m;
			s=p[k-1]; 
			xx=g[k-1];
            for (i=j; i<=n-1; i++)
              { 
				t=p[n-i+j-1];
				x0=g[n-i+j-1];
                p[k-1]=(s-t)/(x[k-1]-x[m-i-2]);
                g[k-1]=(xx-x0)/(x[k-1]-x[m-i-2]);
                k=n-i+j;
				s=t;
				xx=x0;
              }
          }
        u=-p[m-1]/g[m-1];
        for (i=0; i<=m-1; i++)		//牛顿插值公式确定P系数
          p[i]=p[i]+g[i]*u;
        for (j=1; j<=n-1; j++)
          { 
			k=n-j; 
			h=x[k-1]; 
			s=p[k-1];
            for (i=m-j; i<=n; i++)
              { 
				t=p[i-1]; 
				p[k-1]=s-h*t;
                s=t; 
				k=i;
              }
          }
        p[m-1]=fabs(u); 
		u=p[m-1];
        if (fabs(u-d)<=e) return;		//若精度满足,返回
        d=u; 
		h=0.1*(b-a)/(1.0*n);
        xx=a; 
		x0=a;
        while (x0<=b)	//扫描最大值点xx
          {
			s=(*f)(x0);
			t=p[n-1];
            for (i=n-2; i>=0; i--)
              t=t*x0+p[i];
            s=fabs(s-t);
            if (s>u) 
				{ 
					u=s; 
					xx=x0;
				}
            x0=x0+h;
          }
        s=(*f)(xx);		//计算yy=f(x)-P(x)
		t=p[n-1];
        for (i=n-2; i>=0; i--)
          t=t*xx+p[i];
        yy=s-t;
		i=1;
		j=n+1;
        while ((j-i)!=1)	//寻找最大值点应处在点集中的位置
          { 
			k=(i+j)/2;
            if (xx<x[k-1]) j=k;
            else i=k;
          }
        if (xx<x[0])	//最大值点xx应在a与x0之间
          { 
			s=(*f)(x[0]);
			t=p[n-1];
            for (k=n-2; k>=0; k--)	//计算f(x0)-P(x0)
              t=t*x[0]+p[k];
            s=s-t;
            if (s*yy>0.0) x[0]=xx;	//若f(x)-P(x)与f(x0)-P(x0)同号,用xx代替x0
            else
              {
				for (k=n-1; k>=0; k--)
                  x[k+1]=x[k];
                x[0]=xx;
              }
          }
        else
          { 
			if (xx>x[n])	//最大值点xx应在xn+1与b之间
              {
				s=(*f)(x[n]); t=p[n-1];
                for (k=n-2; k>=0; k--)	//计算f(xn+1)-P(xn+1)
                  t=t*x[n]+p[k];
                s=s-t;
                if (s*yy>0.0) x[n]=xx;	//若f(x)-P(x)与f(x0)-P(x0)同号,用xx代替xn+1
                else
                  { 
					for (k=0; k<=n-1; k++)
                      x[k]=x[k+1];
                    x[n]=xx;
                  }
              }
            else	//最大值点xx应在xk+1与xk之间
              { 
				i=i-1;
				j=j-1;
                s=(*f)(x[i]);
				t=p[n-1];
                for (k=n-2; k>=0; k--)	//计算f(xk)-P(xk)
                  t=t*x[i]+p[k];
                s=s-t;
                if (s*yy>0.0) x[i]=xx;	//若f(x)-P(x)与f(x0)-P(x0)同号,用xx代替xk,否则用xx代替xk+1
                else x[j]=xx;
              }
          }
      }
}

double f(double x)
{ 
	double y;
    y=sqrt(x);	//待逼函数
    return(y);
}

void main()
{ 
	cout << "  *******************************************" << endl;
	cout << "  **                                       **" << endl;
	cout << "  **          最佳一致逼近多项式           **" << endl;
	cout << "  **                                       **" << endl;
	cout << "  *******************************************" << endl << endl;
	double a,b,e,p[5],f(double);
    a=0.25;		//逼近区间下限
	b=1.0;		//逼近区间上限
	e=1.0e-10;	//逼近精度
    bua(a,b,p,2,e,f);
    cout << "所求一次最佳一致逼近多项式为:" << endl;
	cout << "P1(x)=" << p[1] << "x+" << p[0] << endl;
 }

⌨️ 快捷键说明

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