//函數(shù)功能有,求多項(xiàng)式的和,鬧轎差,積
創(chuàng)新互聯(lián)于2013年創(chuàng)立,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站制作、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元沁陽(yáng)做網(wǎng)站,已為上家服務(wù),為沁陽(yáng)各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話(huà):18980820575
/*
輸入函數(shù)的輸入操作:1,先輸入多項(xiàng)式的成員的個(gè)數(shù)n:(如 x+1,的n=2);
2,輸入多項(xiàng)式(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); //創(chuàng)建n各節(jié)點(diǎ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); //排序,合并同類(lèi)項(xiàng)
int len(Linklist head); //求多項(xiàng)式的長(zhǎng)度
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) //如果系數(shù)coef==0 則刪除該項(xiàng)成員
{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;
}
其實(shí)很簡(jiǎn)單的。。就困空并是個(gè)汪跡搜索窮解問(wèn)題哎。。
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;
};
};
}
#include stdio.h
#include math.h
#include string.h
int p=4; //p為選定的擬合次數(shù)并加1,默認(rèn)值為4,輪做跡即擬合次數(shù)3
int t=5; //t為用戶(hù)輸入的數(shù)據(jù)的個(gè)數(shù)
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; //在程序中為中間變量來(lái)記錄循環(huán)次數(shù)
double ss=0; // 在計(jì)算矩陣中未知參數(shù)的臨時(shí)變量
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[]為用戶(hù)輸入的橫坐標(biāo)的值
double a[5][5]; //a[ ][ ] 記錄在最小二乘算臘并法中產(chǎn)生的系數(shù)矩陣
double b[5]; //常數(shù)矩陣的元素的值
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");
//計(jì)算系數(shù)矩陣的每個(gè)元素 a[i][j]和a[j][i]
for(j=1;j=p;j++) //p為選定的擬合次數(shù)并加1,默認(rèn)值為4,即擬合次數(shù)3
{
for(i=1;i=j;i++)
{
ss=0;
for( k=1;k=t;k++)
{ //t為用戶(hù)輸入的數(shù)據(jù)的個(gè)數(shù)
ss=ss+pow(x[k],i+j-2);
} //x[]為用戶(hù)輸入的橫坐標(biāo)的值
a[i][j] = ss; //ss為臨時(shí)變量
a[j][i]= ss;
} //a[ ][ ] 記錄在最小二乘算法中產(chǎn)生的系數(shù)矩陣
}
printa(a);
//計(jì)算常胡殲數(shù)矩陣的每個(gè)元素的值
for(i=1;i=p;i++)
{
ss=0;
for(k=1;k=t;k++)
{
ss=ss+y[k]*pow(x[k],i-1);
} //y[ ]為用戶(hù)的輸入的縱坐標(biāo)值
b[i] = ss;
}
printb(b);
//用Guass消去法解線(xiàn)性方程組
for(k=1;k=p;k++)
{
m=fabs(a[k][k]);//計(jì)算a[k][k]的絕對(duì)值
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;
}
//消元計(jì)算
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];
}
}
//擬合多項(xiàng)式
printf("\nResult=");
for(i=1;i=p;i++)
{
printf("%5.2e x^%d+\t",b[i],i-1);
}
}
結(jié)果看最后:
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
========擬合次數(shù)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+
首先,誰(shuí)都不能根據(jù)僅有的數(shù)據(jù)集來(lái)斷定這就是什么曲線(xiàn)。
我們只能通過(guò)對(duì)數(shù)據(jù)觀察推測(cè)可能會(huì)符合什么拍族指形式的曲線(xiàn)。
已知10個(gè)數(shù)據(jù)點(diǎn)的訓(xùn)練集,可以采用多項(xiàng)式擬合的辦法來(lái)做,但是不建議使用C語(yǔ)言來(lái)實(shí)現(xiàn)。
這種數(shù)學(xué)問(wèn)題用matlab很容易就可以解決,c語(yǔ)言寫(xiě)要麻襲配煩的多的多。比如你采用最小二乘法的話(huà),
你需要自己用c語(yǔ)言寫(xiě)很多矩穗配陣運(yùn)算。
分享題目:二次擬合函數(shù)c語(yǔ)言 二次函數(shù)擬合的參數(shù)如何求
本文網(wǎng)址:http://m.newbst.com/article0/ddpehio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、做網(wǎng)站、網(wǎng)站排名、網(wǎng)站維護(hù)、建站公司、網(wǎng)站營(yíng)銷(xiāo)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)