多项式拟合C++程序

多项式拟合C++程序,第1张

这是我们数字计算课程设计关于多项式拟合的一道题目!

感觉写的还比较满意!

#include <iostream>

#include <iomanip>

#include <math.h>

using namespace std

double o=0.5

float a[10] //所构造的多项式的系数

float b[10][10] //求多项式系数时需要的矩阵

float x[15],y[15] //采样坐标点

void p (int,int)//对所构造的多项式系数求解的增广矩阵赋值

float f(int,int)//x[i]次幂求和函数

float fy(int ,int )//x[i]次幂与y[i]乘积求和函数

void G(int) //求解方程函数

float F(float [],int,int )//供C调用

void suofang(float,int) //离散点的缩放函数

void kongzhi(int) //控制缩放的比例

void tuxing1() //显示构造的直线

void tuxing2()//显示构造的抛物线

void main()

{

int n

cout<<"\t\t\t程序使用说明"<<endl

cout<<"\t\t\t+--------------------+"<<endl

cout<<"\t\t\t|欢迎使用多项式拟合, |"<<endl

cout<<"\t\t\t|本程序在求解的过程 |"<<endl

cout<<"\t\t\t|中所以的图形都是一 |"<<endl

cout<<"\t\t\t|个大致的轮廓,但所求 |"<<endl

cout<<"\t\t\t|解的多项式的比较精确|"<<endl

cout<<"\t\t\t+--------------------+"<<endl

cout<<endl<<endl<<"请输入样点坐标的个数(n>0): n="

cin>>n

cout<<endl<<endl<<"(注意:x的值一定要从小到大输入)"<<endl

cout<<"输入坐标值:"<<endl

for(int i=0i<ni++) //依次输入坐标点

{

cout<<"x["<<i<<"]="

cin>>x[i]

cout<<"y["<<i<<"]="

cin>>y[i]

}

suofang(o,n)

char w

do{//根据所描绘的坐标点选择合适构造合适的多项式

system("cls")

cout<<"1.一次多项式"<<endl

cout<<"2.二次多项式"<<endl

cout<<"3.次数大于2的多项式"<<endl

cout<<"根据描绘的离散的点选择你要构造的多项式的类型:(1-3):"

cin>>w

}while(w!='1'&&w!='2'&&w!='3')

switch(w)

{

case '1':

p(n,2)

tuxing1()break

case '2':

p(n,3)

tuxing2()break

case '3':

cout<<"你要构造的多项式的最高次幂:(2<m<"<<n<<") m="

int k

cin>>k

p(n,k+1)

cout<<"--------------描绘图形功能未增加!----------------"<<endl

break

}

}

void p(int n,int k) //对所构造的多项式系数求解的增广矩阵赋值

{

for(int i=1i<=ki++)

{

for(int j=1j<=kj++)

b[i][j]=f(i+j-2,n)

b[i][k+1]=fy(i-1,n)

}

b[1][1]=n

G(k)

}

float f(int k,int n)//x[i]次幂求和函数

{

float sum=0

for(int i=0i<ni++)

sum+=pow(x[i],k)

return sum

}

float fy(int k,int n) //x[i]次幂与y[i]乘积求和函数

{

float sum=0

for(int i=0i<ni++)

sum+=y[i]*pow(x[i],k)

return sum

}

void G(int m)//求解方程函数

{

for(int k=1k<mk++) //消元过程

{

for(int i=k+1i<m+1i++)

{

float p1

if(b[k][k]!=0)

p1=b[i][k]/b[k][k]

for(int j=kj<m+2j++)

b[i][j]=b[i][j]-b[k][j]*p1

}

}

a[m]=b[m][m+1]/b[m][m]

for(int l=m-1l>=1l--) //回代求解

a[l]=(b[l][m+1]-F(a,l+1,m))/b[l][l]

cout<<endl<<"------说明:输出的多项式[]中的数代表指数"<<endl<<endl

cout<<"你所构造的多项式为:y=" //系数保留4位小数输出多项式

if(a[1]!=0)

cout<<setiosflags(ios::fixed)<<setprecision(4)<<a[1]

for(int i=2i<m+1i++)

{

if(a[i]>0)

cout<<" + "<<setiosflags(ios::fixed)<<setprecision(4)<<a[i]<<"*X"<<"["<<i-1<<"]"

else if(a[i]<0)

cout<<setiosflags(ios::fixed)<<setprecision(4)<<a[i]<<"*X"<<"["<<i-1<<"]"

}

cout<<endl

}

float F(float c[],int l,int m)//供G函数调用

{

float sum=0

for(int i=li<=mi++)

sum+=b[l-1][i]*c[i]

return sum

}

void suofang(float t,int n)//离散点的缩放函数

{

cout<<endl<<endl<<"离散的坐标点的拟合图形:"<<endl

cout<<"O---------------------------------------->Y"<<endl

cout<<"|"

for(int i=0i<ni++)

{

for(float j=y[1]-tj<y[i]j=j+t)

cout<<" "

cout<<"*"

for(int l=0l<(x[i+1]-x[i])/tl++)

cout<<endl<<"|"

}

cout<<endl<<"X"<<endl<<endl

kongzhi(n)

}

void kongzhi(int n) //控制缩放比例

{

char w

do

{

cout<<"如果对所描绘的离散坐标点不满意"<<endl

cout<<"你可以进行一下 *** 作来调节离散点"<<endl

cout<<"1-缩小离散图"<<endl

cout<<"2-放大离散图"<<endl

cout<<"3-进入下一步"<<endl

if(o<0.02&&o>=0.01)

cout<<"--------------不能再放大,继续放大程序将终止!选择(1-2)----------"<<endl

cout<<"选择你的 *** 作(1-3):"

cin>>w

}while((w!='1')&&(w!='2')&&(w!='3'))

switch(w)

{

case '1':

o=o+0.1

suofang(o,n)break

case '2':

if(o<0.2)

o=o-0.01

else

o=o-0.1

if(o<0.01)

exit(1)

suofang(o,n)break

case '3':

break

}

}

void tuxing1() //直线描绘函数

{

cout<<endl<<"构造的直线如下:"<<endl

cout<<"-------------------------------------->Y"<<endl

cout<<"|"

for(int x=1x<=10x++)

{

float y=x*a[2]+a[1]

if(a[2]>0)

{

for( float j=a[1]j<yj=j+0.5*a[2])

cout<<" "

cout<<"*"<<endl<<"|"

}

if(a[2]<0)

{

for(float j=10*a[2]+a[1]j<yj=j+0.5*(-a[2]))

cout<<" "

cout<<"*"<<endl<<"|"

}

}

cout<<endl<<"X"<<endl

}

void tuxing2()//抛物线描绘函数

{

cout<<endl<<"构造的抛物线如下:"<<endl

cout<<"-------------------------------------->Y"<<endl

cout<<"|"

for(float i=-0.5*a[2]/a[3]-7i<=-0.5*a[2]/a[3]+7i=i+1)

{

float x=a[1]+a[2]*i+a[3]*i*i

if(a[3]>0)

{

float h=(4*a[3]*a[1]-a[2]*a[2])/(4*a[3]*a[3])

for(float j=h-13.5*a[3]*0.4j<xj=j+13.5*a[3]*0.4)

cout<<" "

cout<<"*"<<endl<<"|"

}

if(a[3]<0)

{

for(float j=a[1]+a[2]*(-0.5*a[2]/a[3]-7)+a[3]*(-0.5*a[2]/a[3]-7)*(-0.5*a[2]/a[3]-7)-13.5*a[3]*0.4j<xj=j+13.5*(-a[3])*0.4)

cout<<" "

cout<<"*"<<endl<<"|"

}

}

cout<<endl<<"X"<<endl

}

#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=0i<poly_n+1i++)/*这里是升序排列,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=0i<ni++)

{

tempx[i]=1

tempy[i]=y[i]

}

for (i=0i<2*poly_n+1i++)

for (sumxx[i]=0,j=0j<nj++)

{

sumxx[i]+=tempx[j]

tempx[j]*=x[j]

}

for (i=0i<poly_n+1i++)

for (sumxy[i]=0,j=0j<nj++)

{

sumxy[i]+=tempy[j]

tempy[j]*=x[j]

}

for (i=0i<poly_n+1i++)

for (j=0j<poly_n+1j++)

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=0k<n-1k++)

{

max=fabs(A[k*n+k])/*find maxmum*/

r=k

for (i=k+1i<n-1i++)

if (max<fabs(A[i*n+i]))

{

max=fabs(A[i*n+i])

r=i

}

if (r!=k)

for (i=0i<ni++) /*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+1i<ni++)

{

for (j=k+1j<nj++)

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]

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11089089.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存