软件编程课程设计Word格式文档下载.docx
- 文档编号:17395317
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:26
- 大小:125.26KB
软件编程课程设计Word格式文档下载.docx
《软件编程课程设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《软件编程课程设计Word格式文档下载.docx(26页珍藏版)》请在冰豆网上搜索。
>
m;
if(m>
MAX_N)
{
cout<
TheinputmislargerthanMAX_N,pleaseredefinetheMAX_N."
//输入点数超过设定的最大值,提示重新输入
return1;
}
if(m<
=0)
Pleaseinputanumberbetween1and"
<
MAX_N<
//输入的点数<
=0,提示重新输入
Nowinputthe(x_i,y_i),i=,……,"
m-1<
//输入数据
for(i=0;
i<
m;
i++)//输入变量值,存入结构体函数
cin>
points[i].x;
points[i].y;
i++)//列出方程U(a,b)'
=c
u21+=points[i].x;
//x的和
u22+=points[i].x*points[i].x;
//x的平方和
c1+=points[i].y;
//y的和
c2+=points[i].x*points[i].y;
//x*y的和
u12=u21;
u11=m;
//开始求解
a=(c1*u22-c2*u12)/(u11*u22-u12*u21);
//求a
b=(c1*u21-c2*u11)/(u21*u12-u22*u11);
//求b
Solve:
p(x)="
a<
+"
b<
x"
return0;
}
(3)程序运行界面截图:
(4)调试中出现的问题及解决方法:
为了用最小二乘法计算拟合曲线的系数,一开始定义了许多变量,使程序显得很乱,不简洁。
后来改用结构体变量,把要求的系数放在一个结构体变量中,精简了程序。
2.一般多项式观测数据:
Xi:
-3-2-10123
Yi:
4230-1-2-5
#include"
stdio.h"
math.h"
stdlib.h"
windows.h"
//引用头文件
doublesum(double*dNumarry,intn);
//求和的函数
doubleMutilSum(double*dX,double*dY,intn);
//求乘法的函数
doubleRelatePow(double*dx,intn,intex);
//计算x的y次幂的函数
doubleRelateMutiXY(double*dx,double*dy,intn,intex);
//关联xy的函数
voidEMatrix(double*dx,double*dy,intn,intex,doublecoefficient[]);
//定义变量,确定多项式阶数
voidCalEquation(intexp,doublecoefficient[]);
doubleF(doublec[],intl,intm);
doubleEm[10][10];
//所构造的多项式的系数
intmain(intargc,char*argv[])
{
doublearry1[7]={-3,-2,-1,0,1,2,3};
doublearry2[7]={4,2,3,0,-1,-2,-5};
//写入观测值
doublecoefficient[10];
ZeroMemory(coefficient,sizeof(double)*10);
//doubledSumarry1=sum(arry1,7);
//printf("
darry1=%lf\n"
dSumarry1);
//
//doubledSumarry2=sum(arry2,7);
darry2=%lf\n"
dSumarry2);
//doubledMultiarry1=MutilSum(arry1,arry1,7);
dMultiarry1=%lf\n"
dMultiarry1);
//doubledMultiarry12=MutilSum(arry1,arry2,7);
dMultiarry2=%lf\n"
dMultiarry12);
//,coefficient[4],coefficient[5]
//+%lfx^3+%lfx^4
EMatrix(arry1,arry2,7,3,coefficient);
//给变量赋值,此处ex=3是拟合二次多项式
printf("
拟合方程为:
y=%lf+%lfx+%lfx^2\n"
coefficient[1],coefficient[2],coefficient[3]);
}
doublesum(double*dNumarry,intn)
double*dTemp=newdouble[n];
doubledSum=0;
dTemp=dNumarry;
for(inti=0;
i<
n;
i++)
{
dSum+=dTemp[i];
}
returndSum;
//求和
doubleMutilSum(double*dX,double*dY,intn)
double*dXTemp=newdouble[n];
double*dYTemp=newdouble[n];
doubledMultiSum=0;
dXTemp=dX;
dYTemp=dY;
dMultiSum+=dX[i]*dY[i];
returndMultiSum;
//求x和y的乘积
doubleRelatePow(double*dx,intn,intex)
double*dTemp=newdouble[n];
doubleReSum=0;
dTemp=dx;
for(intj=0;
j<
j++)
ReSum+=pow(dTemp[j],ex);
returnReSum;
//计算x的幂
doubleRelateMutiXY(double*dx,double*dy,intn,intex)
doubledReMultiSum=0;
dXTemp=dx;
dYTemp=dy;
dReMultiSum+=pow(dXTemp[i],ex)*dYTemp[i];
returndReMultiSum;
//计算方程组的增广矩阵
voidEMatrix(double*dx,double*dy,intn,intex,doublecoefficient[])
for(inti=1;
=ex;
for(intj=1;
Em[i][j]=RelatePow(dXTemp,n,i+j-2);
Em[i][ex+1]=RelateMutiXY(dXTemp,dYTemp,n,i-1);
Em[1][1]=n;
CalEquation(ex,coefficient);
//x的系数
//求解方程
voidCalEquation(intexp,doublecoefficient[])
for(intk=1;
k<
exp;
k++)//消元过程
for(inti=k+1;
exp+1;
doublep1=0;
if(Em[k][k]!
=0)
p1=Em[i][k]/Em[k][k];
for(intj=k;
exp+2;
Em[i][j]=Em[i][j]-Em[k][j]*p1;
coefficient[exp]=Em[exp][exp+1]/Em[exp][exp];
for(intl=exp-1;
l>
=1;
l--)//回代求解
coefficient[l]=(Em[l][exp+1]-F(coefficient,l+1,exp))/Em[l][l];
doubleF(doublec[],intl,intm)//供CalEquation函数调用
doublesum=0;
for(inti=l;
=m;
sum+=Em[l-1][i]*c[i];
returnsum;
通过网上资料查找首先了解什么是最小二乘法的多项式拟合。
拟合过程中随着高阶逐渐增加拟合的曲线也会存在病态,所以有时候对比较高的高阶需要压缩后在拟合。
这里是没有经过压缩的拟合,我会继续深入研究更高阶的曲线拟合。
EMatrix这个函数的ex要加1,就是说如果要求四次就要ex要写5。
二.用OpenGL的图形库设计长方体。
1.长方体的六个面对应六张不同的图像,可以通过键盘进行上下左右旋转。
windows.h>
//Windows的头文件
gl/glut.h>
//OpenGL32库的头文件
stdio.h>
stdlib.h>
#pragmacomment(lib,"
glaux.lib"
)//GLaux连接库
gl\glaux.h>
//GLaux库的头文件
staticGLfloatxRot=0.0f;
//建立x轴的坐标
staticGLfloatyRot=0.0f;
//建立y轴的坐标
GLuinttexture[6];
//纹理填充
AUX_RGBImageRec*LoadBMP(char*FileName)//加载.bmp图像,返回该图像的指针
FILE*File=NULL;
if(!
FileName)
returnNULL;
File=fopen(FileName,"
r"
);
if(File)
fclose(File);
returnauxDIBImageLoad(FileName);
//载入.bmp格式的贴图纹理
intLoadGLTextures()//载入位图(调用上面的代码)并转换成纹理
intStatus=FALSE;
char*bmpFile[6]={"
1.bmp"
"
2.bmp"
3.bmp"
//创建纹理的存储空间
"
4.bmp"
5.bmp"
6.bmp"
};
AUX_RGBImageRec*TextureImage[6]={NULL,NULL,NULL,NULL,NULL,NULL};
for(inti=0;
i<
6;
++i)
//memset(TextureImage[i],0,sizeof(void*)*1);
//setthepointtoNULL
if(TextureImage[i]=LoadBMP(bmpFile[i]))
Status=TRUE;
glGenTextures(1,&
texture[i]);
//命名纹理对象
glBindTexture(GL_TEXTURE_2D,texture[i]);
//绑定纹理
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,TextureImage[i]->
sizeX,
TextureImage[i]->
sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,
data);
//指定纹理
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
//指定过滤模式
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
if(TextureImage[i])
if(TextureImage[i]->
data)
free(TextureImage[i]->
free(TextureImage[i]);
returnStatus;
voidRenderScene(void)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
LoadGLTextures());
glEnable(GL_TEXTURE_2D);
LoadGLTextures();
//载入纹理贴图
glPushMatrix();
glRotatef(xRot,1.0f,0.0f,0.0f);
glRotatef(yRot,0.0f,1.0f,0.0f);
glBindTexture(GL_TEXTURE_2D,texture[0]);
glBegin(GL_QUADS);
//glColor3f(1.0,0.0,0.0);
//红色
glTexCoord2f(0.0f,0.0f);
glVertex3f(10.0f,10.0f,20.0f);
//上面
glTexCoord2f(1.0f,0.0f);
glVertex3f(-10.0f,10.0f,20.0f);
glTexCoord2f(1.0f,1.0f);
glVertex3f(-10.0f,-10.0f,20.0f);
glTexCoord2f(0.0f,1.0f);
glVertex3f(10.0f,-10.0f,20.0f);
glEnd();
glBindTexture(GL_TEXTURE_2D,texture[1]);
glBegin(GL_POLYGON);
//glColor3f(0.0,1.0,0.0);
//绿色
glVertex3f(10.0,10.0,-10.0);
//右面
glTexCoord2f(0.0f,0.0f);
glVertex3f(10.0,10.0,20.0);
glVertex3f(10.0,-10.0,20.0);
glVertex3f(10.0,-10.0,-10.0);
glBindTexture(GL_TEXTURE_2D,texture[2]);
//glColor3f(0.0,0.0,1.0);
//蓝色
glTexCoord2f(1.0f,0.0f);
glVertex3f(10.0,-10.0,-10.0);
//下面
glVertex3f(-10.0,-10.0,-10.0);
glVertex3f(-10.0,10.0,-10.0);
glTexCoord2f(0.0f,0.0f);
glVertex3f(10.0,10.0,-10.0);
glBindTexture(GL_TEXTURE_2D,texture[3]);
//glColor3f(1.0,1.0,0.0);
//黄色
glVertex3f(-10.0,10.0,20.0);
//左面
glVertex3f(-10.0,-10.0,-10.0);
glVertex3f(-10.0,-10.0,20.0);
glBindTexture(GL_TEXTURE_2D,texture[4]);
//glColor3f(0.0,1.0,1.0);
glTexCoord2f(1.0f,1.0f);
glVertex3f(10.0,10.0,-10.0);
//后面
glVertex3f(-10.0,10.0,-10.0);
glVertex3f(-10.0,10.0,20.0);
glTexCoord2f(1.0f,0.0f);
glVertex3f(10.0,10.0,20.0);
glBindTexture(GL_TEXTURE_2D,texture[5]);
//glColor3f(1.0,0.0,1.0);
glVertex3f(10.0,-10.0,20.0);
//前面
glTexCoord2f(0.0f,1.0f);
glEnd();
glPopMatrix();
glutSwapBuffers();
/*voidSetupRC()
//glClearColor(0.0f,0.0f,0.0f,1.0f);
glColor3f(0.0f,1.0f,0.0f);
glShadeModel(GL_FLAT);
//glFrontFace(GL_CW);
}*/
voidSpecialKeys(intkey,intx,inty)//设置键盘控制
if(key==GLUT_KEY_UP)
xRot-=5.0f;
if(key==GLUT_KEY_DOWN)
xRot+=5.0f;
if(key==GLUT_KEY_LEFT)
yRot-=5.0f;
if(key==GLUT_KEY_RIGHT)
yRot+=5.0f;
if(key>
356.0f)
xRot=0.0f;
if(key<
-1.0f)
xRot=355.0f;
yRot=0.0f;
yRot=355.0f;
glutPostRedisplay();
voidChangeSize(intw,inth)
GLfloatnRange=25.0f;
if(h==0)
h=1;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
//设置下面的操作矩阵为GL_MODELVIEW
glLoadIdentity();
if(w<
=h)
glOrtho(-nRange,nRange,-nRange*h/w,nRan
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件 编程 课程设计