📄 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 + -