感觉写的还比较满意!
#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]
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)