求一个n阶多项式二乘拟合的算法,最好是C语言
//函数功能有,求多项式的和,闹轿差,积
创新互联于2013年创立,是专业互联网技术服务公司,拥有项目成都网站制作、成都网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元沁阳做网站,已为上家服务,为沁阳各地企业和个人服务,联系电话:18980820575
/*
输入函数的输入操作:1,先输入多项式的成员的个数n:(如 x+1,的n=2);
2,输入多项式(x+1),格式如下:
coef expn
1 1
1 0
*/
#include stdio.h
#include stdlib.h
typedef struct {
float coef;
int expn;
}Elemtype;
typedef struct node{
Elemtype data;
node *next;
}LNode,*Linklist;
Linklist creat(int n); //创建n各节点,并初始化
void print(Linklist head);//输出
Linklist Add(Linklist f1,Linklist f2); //f1+f2
Linklist sub(Linklist f1,Linklist f2); //f1-f2
Linklist mult(Linklist f1,Linklist f2); //f1*f2
Linklist turn(Linklist head); //排序,合并同类项
int len(Linklist head); //求多项式的长度
void main()
{
Linklist f1,f2,f4,f3;
printf(" Polyn + - *\n");
printf("Input polyn \nPolyn f1 input data n:");
int n;scanf("%d",n);
f1=creat(n);
printf("Polyn f2 input data n:");
scanf("%d",n);
f2=creat(n);
printf("\李敏nOUT Polyn;\n");
printf("polyn1:"); print(f1);
printf("polyn2:"); print(f2);
f3=Add(f1,f2); printf("polyn Add f1+f2:"); print(f3);
f4=sub(f1,f2); printf("polyn sub f1-f2"); print(f4);
printf("polyn mult f1*f2:"); print(mult(f1,f2));
}
Linklist turn(Linklist head)
{
Linklist p, q;
if(!head-next) return head;
Elemtype temp;
for (q=head;q-next;q=q-next)
{
for (p=q-next;p;p=p-next)
{
if(p-data.expnq-data.expn)
{
temp=p-data;p-data=q-data;q-data=temp;
}
else if(p-data.expn==q-data.expn) {
q-液扰肆data.coef=q-data.coef+p-data.coef;p=p-next;
q-next=p; if(!p||!p-next) break;
}
}
if((q==NULL)||(q-next==NULL)) break;
}
return head;
}
Linklist creat(int n)
{
Linklist head,p,pf;
printf("input %d data :\n coef expn\n",n);
for(int i=0;in;i++)
{
pf=(Linklist)malloc(sizeof(LNode));
if(i==0)
head=p=pf;
printf("NO %d : ",i+1);
scanf("%f%d",pf-data.coef,pf-data.expn);
if(pf-data.coef) {p-next=pf;
p=p-next;}
}
p-next=NULL;
head=turn(head);
return head;
}
void print(Linklist head)
{
Linklist p;
p=head;
printf("\n coef expn\n");
while(p){
printf(" %6.2f %4d\n",p-data.coef,p-data.expn);
p=p-next;
}
printf("\n");
}
int len(Linklist head)
{
Linklist p;
p=head;
int n;
for(n=0;p;p=p-next,n++);
return n;
}
Linklist Add(Linklist f1,Linklist f2) //f1+f2
{
Linklist p1,p2,f;
Linklist p,pf;
p1=f1; p2=f2;
p=f=(Linklist)malloc(sizeof(LNode));f-next=NULL;
while (p1||p2)
{
pf=(Linklist)malloc(sizeof(LNode));
if(p1(p2==NULL))
{
pf-data=p1-data;
p1=p1-next;
}
else if(p2(p1==NULL)){
pf-data=p2-data;
p2=p2-next;
}
else if(p1-data.expn-p2-data.expn==0)
{
pf-data.coef=p1-data.coef+p2-data.coef;
pf-data.expn=p1-data.expn;
p1=p1-next;p2=p2-next;
}
else if(p1-data.expnp2-data.expn)
{
pf-data=p1-data;
p1=p1-next;
}
else if(p1-data.expnp2-data.expn){
pf-data=p2-data;
p2=p2-next;
}
if(pf-data.coef) //如果系数coef==0 则删除该项成员
{p-next=pf;
p=p-next;}
}
p-next=NULL;f=f-next; f=turn(f);
return f;
}
Linklist sub(Linklist f1,Linklist f2) //f1-f2
{
Linklist p1,p2,f;
Linklist p,pf;
p1=f1; p2=f2;
p=f=(Linklist)malloc(sizeof(LNode));f-next=NULL;
while (p1||p2)
{
pf=(Linklist)malloc(sizeof(LNode));
if(p1(p2==NULL))
{
pf-data=p1-data;
p1=p1-next;
}
else if(p2(p1==NULL)){
pf-data.expn=p2-data.expn;
pf-data.coef=-p2-data.coef;
p2=p2-next;
}
else if(p1-data.expn-p2-data.expn==0)
{
pf-data.coef=p1-data.coef-p2-data.coef;
pf-data.expn=p1-data.expn;
p1=p1-next;p2=p2-next;
}
else if(p1-data.expnp2-data.expn)
{
pf-data=p1-data;
p1=p1-next;
}
else if(p1-data.expnp2-data.expn){
pf-data.expn=p2-data.expn;
pf-data.coef=-(p2-data.coef);
p2=p2-next;
}
if(pf-data.coef)
{p-next=pf;
p=p-next;}
}
p-next=NULL;f=f-next; f=turn(f);
return f;
}
Linklist mult(Linklist f1,Linklist f2) //f1*f2
{
Linklist p1,p2,f;
Linklist pf;f=NULL;
for(p1=f1;p1;p1=p1-next)
{
for(p2=f2;p2;p2=p2-next)
{
pf=(Linklist)malloc(sizeof(LNode));
pf-data.expn=p1-data.expn+p2-data.expn;
pf-data.coef=p1-data.coef*p2-data.coef;
pf-next=NULL;
f=Add(f,pf);
pf=NULL;
}
}
f=turn(f);
return f;
}
如何用c语言拟合二次方程y=a(x-x0)(x-x0) + b(x-x0) + c,根据多组(x,y)的值计算出参数a,b,c,x0的值?
其实很简单的。。就困空并是个汪迹搜索穷解问题哎。。
void SOLVE(float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4)
{
for(a=-10000;a10000;a++)
for(b=-10000;b10000;b++)
for(c=-10000;c10000;c++)
for(x0=-10000;x010000;x0++)
{
if(y1=a(x1-x0)(x1-x0) + b(x1-x0) + c)
if(y2=a(x2-x0)(x2-x0) + b(x2-x0) + c)
if(y3=a(x3-x0)(x3-x0) + b(x3-x0) + c)
if(y4=a(x4-x0)(x4-x0) + b(x4-x0) + c)
{
cout"a="a",""b="b","亏差"c="c",""x0="x0endl;
};
};
}
跪求c语言高手,编条程序用来算5个坐标点的二次多项式拟合方程???急要,谢谢!!!
#include stdio.h
#include math.h
#include string.h
int p=4; //p为选定的拟合次数并加1,默认值为4,轮做迹即拟合次数3
int t=5; //t为用户输入的数据的个数
void printa(double a[5][5])
{
int i,j;
for(j=1;j=p;j++)
{
for(i=1;i=p;i++)
{
printf("a[%d][%d]=%5.2e\t",j,i,a[j][i]);
}
printf("\n");
}
}
void printb(double b[5])
{
int i;
for(i=1;i=p;i++)
{
printf("b[%d]=%5.2e\t",i,b[i]);
}
printf("\n");
}
main()
{
int i=1,j=1, k=1, r; //在程序中为中间变量来记录循环次数
double ss=0; // 在计算矩阵中未知参数的临时变量
double temp,m; //中间变量
double x[6]={0,5,10,15,20,25},y[6]={0,1.0029,1.0023,1.0000,0.9990,0.9983}; //x[]为用户输入的横坐标的值
double a[5][5]; //a[ ][ ] 记录在最小二乘算腊并法中产生的系数矩阵
double b[5]; //常数矩阵的元素的值
for(i=1;i=5;i++)
{
printf("x[%d]=%5.2e \t",i,x[i]);
}
printf("\n");
for(i=1;i=5;i++)
{
printf("y[%d]=%5.2e \t",i,y[i]);
}
printf("\n");
//计算系数矩阵的每个元素 a[i][j]和a[j][i]
for(j=1;j=p;j++) //p为选定的拟合次数并加1,默认值为4,即拟合次数3
{
for(i=1;i=j;i++)
{
ss=0;
for( k=1;k=t;k++)
{ //t为用户输入的数据的个数
ss=ss+pow(x[k],i+j-2);
} //x[]为用户输入的横坐标的值
a[i][j] = ss; //ss为临时变量
a[j][i]= ss;
} //a[ ][ ] 记录在最小二乘算法中产生的系数矩阵
}
printa(a);
//计算常胡歼数矩阵的每个元素的值
for(i=1;i=p;i++)
{
ss=0;
for(k=1;k=t;k++)
{
ss=ss+y[k]*pow(x[k],i-1);
} //y[ ]为用户的输入的纵坐标值
b[i] = ss;
}
printb(b);
//用Guass消去法解线性方程组
for(k=1;k=p;k++)
{
m=fabs(a[k][k]);//计算a[k][k]的绝对值
r=k;
//选主元
for(i=k;i=p;i++)
{
if( mfabs(a[i][k]))
{
m=fabs(a[i][k]);
r=i;
}
}
if(rk)
{ //交换两行
for(j=k;j=p;j++)
{
temp=a[k][j];
a[k][j]=a[r][j];
a[r][j]=temp;
}
temp=b[k];
b[k]=b[r];
b[r]=temp;
}
//消元计算
for(j=k+1;j=p;j++)
a[k][j]=a[k][j]/a[k][k];
b[k]=b[k]/a[k][k];
for(i=1;i=p;i++)
{
if(i==k)
continue;
for(j=k+1;j=p;j++)
a[i][j]=a[i][j]-a[i][k]*a[k][j];
}
for(i=1;i=p;i++)
{
if(i==k)
continue;
b[i]=b[i]-a[i][k]*b[k];
}
}
//拟合多项式
printf("\nResult=");
for(i=1;i=p;i++)
{
printf("%5.2e x^%d+\t",b[i],i-1);
}
}
结果看最后:
a[1][1]=5.00e+000 a[1][2]=7.50e+001 a[1][3]=1.38e+003 a[1][4]=
2.81e+004
a[2][1]=7.50e+001 a[2][2]=1.38e+003 a[2][3]=2.81e+004 a[2][4]=
6.12e+005
a[3][1]=1.38e+003 a[3][2]=2.81e+004 a[3][3]=6.12e+005 a[3][4]=
1.38e+007
a[4][1]=2.81e+004 a[4][2]=6.12e+005 a[4][3]=1.38e+007 a[4][4]=
3.21e+008
b[1]=5.00e+000 b[2]=7.50e+001 b[3]=1.37e+003 b[4]=2.81e+004
Result=1.00e+000 x^0 4.42e-004 x^1 -5.69e-005 x^2 1.33e-006 x^3
========拟合次数2============
x[1]=5.00e+000 x[2]=1.00e+001 x[3]=1.50e+001 x[4]=2.00e+001 x[5]=2.50e+001
y[1]=1.00e+000 y[2]=1.00e+000 y[3]=1.00e+000 y[4]=9.99e-001 y[5]=9.98e-001
a[1][1]=5.00e+000 a[1][2]=7.50e+001 a[1][3]=1.38e+003
a[2][1]=7.50e+001 a[2][2]=1.38e+003 a[2][3]=2.81e+004
a[3][1]=1.38e+003 a[3][2]=2.81e+004 a[3][3]=6.12e+005
b[1]=5.00e+000 b[2]=7.50e+001 b[3]=1.37e+003
Result=1.00e+000 x^0+ -3.44e-004 x^1+ 3.14e-006 x^2+
C语言如何实现二次曲线拟合
首先,谁都不能根据仅有的数据集来断定这就是什么曲线。
我们只能通过对数据观察推测可能会符合什么拍族指形式的曲线。
已知10个数据点的训练集,可以采用多项式拟合的办法来做,但是不建议使用C语言来实现。
这种数学问题用matlab很容易就可以解决,c语言写要麻袭配烦的多的多。比如你采用最小二乘法的话,
你需要自己用c语言写很多矩穗配阵运算。
新闻名称:二次拟合函数c语言 二次函数拟合的参数如何求
文章URL:http://scgulin.cn/article/ddpehio.html