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

📄 approx.c

📁 approx算法以及列主无高斯消去法进行的运算
💻 C
字号:
#include <stdio.h>
#include <math.h>
void approx(float x[],float y[],int m,int n,float a[]){
  int i,j,t;
  float c[20];//float *c=new float[(n+1)*(n+2)];  ????
  float power(int,float);
  void  gass(float *,int,float[]);
  for(i=0;i<=n;i++){                                          //i为行标,j为列标
	  for(j=0;j<=n;j++){
		  *(c+i*(n+2)+j)=0;
		  for(t=0;t<=m-1;t++) *(c+i*(n+2)+j)+=power(i+j,x[t]);//求Xi
	  }
	  *(c+i*(n+2)+n+1)=0;
     for(j=0;j<=m-1;j++) *(c+i*(n+2)+n+1)+=y[j]*power(i,x[j]);//求Yi
  }
  gass(c,n+1,a);

}
//列主无高斯消去法
void gass(float *c,int n,float x[])
{
  int i,j,t,k;
  float p;
  for(i=0;i<=n-2;i++){
   k=i;

//选主元
   for(j=i+1;j<=n-1;j++)
    if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i))))k=j;

//交换
    if(k!=j)
      for(j=i;j<=n;j++){
        p=*(c+i*(n+1)+j);
        *(c+i*(n+1)+j)=*(c+k*(n+1)+j);
        *(c+k*(n+1)+j)=p;
      }
//消元

    for(j=i+1;j<=n-1;j++){
      p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));
       for(t=i;t<=n;t++)*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));
     }
    }
//回代
  for(i=n-1;j>=0;i--){
   for(j=n-1;j>=i+1;j--)(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j));
   x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));
  }
}
 
float power(int i,float v){
   float a=1;
   while(i--)a*=v;
   return a;
}
//例1(P'94')
void main(){
  int i;
  float a[2];
  float x[6]={36.9,46.7,63.7,77.8,84.0,87.5};
  float y[6]={181,197,235,270,283,292};
  approx(x,y,6,1,a);
  for(i=0;i<=1;i++) printf("a[%d]=%f\n",i,a[i]);
  
}
//习题五-1
/*void main(){
  int i;
  float a[3];
  float x[5]={0,1,2,3,4};
  float y[5]={1.1,1.9,3.1,3.9,4.9};
  approx(x,y,5,2,a);
  for(i=0;i<=2;i++) printf("a[%d]=%f\n",i,a[i]);
  
}*/

⌨️ 快捷键说明

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