當前位置:首頁 » 編程語言 » 多項式擬合c語言

多項式擬合c語言

發布時間: 2025-06-21 20:21:32

⑴ 想用c語言編寫多項式擬合的程序

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
main()
{
int i,j,m,n=7,poly_n=2;
double x[7]={1,2,3,4,6,7,8},y[7]={2,3,6,7,5,3,2};
double a[3];
void polyfit(int n,double *x,double *y,int poly_n,double a[]);

system("cls");
polyfit(n,x,y,poly_n,a);

for (i=0;i<poly_n+1;i++)/*這里是升序排列,Matlab是降序排列*/
printf("a[%d]=%g\n",i,a[i]);
getch();
}

/*==================polyfit(n,x,y,poly_n,a)===================*/
/*=======擬合y=a0+a1*x+a2*x^2+……+apoly_n*x^poly_n========*/
/*=====n是數據個數 xy是數據值 poly_n是多項式的項數======*/
/*===返回a0,a1,a2,……a[poly_n],系數比項數多一(常數項)=====*/
void polyfit(int n,double x[],double y[],int poly_n,double a[])
{
int i,j;
double *tempx,*tempy,*sumxx,*sumxy,*ata;
void gauss_solve(int n,double A[],double x[],double b[]);
tempx=calloc(n,sizeof(double));
sumxx=calloc(poly_n*2+1,sizeof(double));
tempy=calloc(n,sizeof(double));
sumxy=calloc(poly_n+1,sizeof(double));
ata=calloc((poly_n+1)*(poly_n+1),sizeof(double));
for (i=0;i<n;i++)
{
tempx[i]=1;
tempy[i]=y[i];
}
for (i=0;i<2*poly_n+1;i++)
for (sumxx[i]=0,j=0;j<n;j++)
{
sumxx[i]+=tempx[j];
tempx[j]*=x[j];
}
for (i=0;i<poly_n+1;i++)
for (sumxy[i]=0,j=0;j<n;j++)
{
sumxy[i]+=tempy[j];
tempy[j]*=x[j];
}
for (i=0;i<poly_n+1;i++)
for (j=0;j<poly_n+1;j++)
ata[i*(poly_n+1)+j]=sumxx[i+j];
gauss_solve(poly_n+1,ata,a,sumxy);

free(tempx);
free(sumxx);
free(tempy);
free(sumxy);
free(ata);
}

void gauss_solve(int n,double A[],double x[],double b[])
{
int i,j,k,r;
double max;
for (k=0;k<n-1;k++)
{
max=fabs(A[k*n+k]); /*find maxmum*/
r=k;
for (i=k+1;i<n-1;i++)
if (max<fabs(A[i*n+i]))
{
max=fabs(A[i*n+i]);
r=i;
}
if (r!=k)
for (i=0;i<n;i++) /*change array:A[k]&A[r] */
{
max=A[k*n+i];
A[k*n+i]=A[r*n+i];
A[r*n+i]=max;
}
max=b[k]; /*change array:b[k]&b[r] */
b[k]=b[r];
b[r]=max;
for (i=k+1;i<n;i++)
{
for (j=k+1;j<n;j++)
A[i*n+j]-=A[i*n+k]*A[k*n+j]/A[k*n+k];
b[i]-=A[i*n+k]*b[k]/A[k*n+k];
}
}

⑵ c語言如何對若干離散點進行m階多項式擬合

m階多項式擬合,是演算法問題,不是計算機語言問題。你先要有你的具體計算策略和方法,數值計算時,用計算機語言寫出程序,算出結果。用 c 語言 或 fortran 語言 或別的語言,大同小異,沒有原則差別。
你先要定出你的方程形式,例如
y = a1*x^m+a2*x^(m-1)+...am
a1,a2,...,am 是 m 個待定系數
把你的離散點[xi,yi] 代入方程,你可以得到 線性方程式 yi = a1*xi^m+a2*xi^(m-1)+...am
若你有 n 個點,就得到 n 個 方程式。若 n<m 有無窮解,若 n=m 有一解。
通常 離散點的個數 遠超過 方程階數,也就是方程個數超出要解的未知數的個數,n>m,這時,
通常 用 最小二乘法 求解 這個線性方程組。也就是所謂的擬合。
最小二乘法 求解 這個線性方程組 的程序 網上(這里不敢寫,寫了,你就看不到我的貼子了)可以找到,自己寫也不復雜。
曲線擬合文章估計網路文庫里也有。

⑶ 急~~~~~~!!!求解!用C語言編寫最小二乘法求數據的擬合曲線~並做出圖顯示擬合效果!高分懸賞!

#include<stdio.h>
#include<math.h>

void Guass(int n,float Array[][10])
{
float s,u;
int i,j,k,a,x,y;
for(i=0;i<n-1;i++)
{
s=Array[i][i];
k=i;
for(a=i+1;a<n;a++)
{
if(fabs(s) < fabs(Array[a][i]))
{
s=Array[a][i];
k=a;
}
}
if(k!=i)
{
for(j=i;j<n+1;j++)
{
u=Array[i][j];Array[i][j]=Array[k][j];Array[k][j]=u;
}
}
for(x=i+1;x<n;x++)
{
u=Array[x][i]/s;
for(y=i;y<n+1;y++)
{
Array[x][y]=Array[x][y]-u*Array[i][y];
}
}
}
for(x=n-1;x>=0;x--)
{
s=0;
for(y=x+1;y<n;y++)
s=s+Array[x][y]*Array[y][n];
Array[x][n]=(Array[x][n]-s)/(Array[x][x]);//得到結果
}
for(i=0;i<n;i++)printf("%f ",Array[i][n]);printf("\n");
}

int main()
{
int n,i,j;
float Array[10][10];
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n+1;j++)
scanf("%f",&Array[i][j]);
}
Guass(n,Array);
return 0;
}
你的串號我已經記下,採納後我會幫你製作

⑷ 求一個n階多項式二乘擬合的演算法,最好是C語言

//函數功能有,求多項式的和,差,積
/*
輸入函數的輸入操作: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.expn>q->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;i<n;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.expn>p2->data.expn)
{
pf->data=p1->data;
p1=p1->next;
}
else if(p1->data.expn<p2->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.expn>p2->data.expn)
{
pf->data=p1->data;
p1=p1->next;
}
else if(p1->data.expn<p2->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;
}

熱點內容
電腦哪個好價格低配置高 發布:2025-06-21 23:44:45 瀏覽:942
派派腳本下載 發布:2025-06-21 23:24:42 瀏覽:933
fast路由器重置密碼是多少 發布:2025-06-21 23:24:42 瀏覽:803
好壓解壓慢 發布:2025-06-21 23:24:41 瀏覽:118
ssh登入伺服器做什麼 發布:2025-06-21 23:23:27 瀏覽:167
安卓手機如何投屏到一體機上 發布:2025-06-21 23:20:09 瀏覽:557
蘋果用戶為什麼不和安卓比較 發布:2025-06-21 23:11:54 瀏覽:952
蘋果手機相片怎麼快速傳安卓手機 發布:2025-06-21 23:07:43 瀏覽:687
初學者怎麼看變速車的配置 發布:2025-06-21 22:11:48 瀏覽:377
90壓縮 發布:2025-06-21 21:54:09 瀏覽:399