软件编程课程设计Word格式文档下载.docx

上传人:b****5 文档编号:17395317 上传时间:2022-12-01 格式:DOCX 页数:26 大小:125.26KB
下载 相关 举报
软件编程课程设计Word格式文档下载.docx_第1页
第1页 / 共26页
软件编程课程设计Word格式文档下载.docx_第2页
第2页 / 共26页
软件编程课程设计Word格式文档下载.docx_第3页
第3页 / 共26页
软件编程课程设计Word格式文档下载.docx_第4页
第4页 / 共26页
软件编程课程设计Word格式文档下载.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

软件编程课程设计Word格式文档下载.docx

《软件编程课程设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《软件编程课程设计Word格式文档下载.docx(26页珍藏版)》请在冰豆网上搜索。

软件编程课程设计Word格式文档下载.docx

>

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 小学教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1