二次拟合函数c语言 二次函数拟合的参数如何求

求一个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语言 二次函数拟合的参数如何求
链接地址:http://myzitong.com/article/ddpehio.html