数据库实验报告Word下载.docx
《数据库实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《数据库实验报告Word下载.docx(24页珍藏版)》请在冰点文库上搜索。
3.连接查询
4.嵌套查询
5.集合查询
3.4数据操作
1.创建视图
2.视图查询
主要仪器设备
笔记本计算机,使用SQLServer提供的MicrosoftSQLServerManagementStudio工具,交互式使用SQL语句。
实验记录(写出实验内容中的程序代码和运行结果)(可分栏或加页)
select*fromStudent
select*fromCourse
select*fromSC
(1)单表查询
SelectSname,'
YearofBirth:
'
asbirth,2000-SageBIRTHDAY,DEPARTMENT=LOWER(Sdept)
formStudent;
(2)分组统计:
selectcno课程号,count(*)人数,AVG(grade)均分,MAX(grade)最高分
fromscgroupbyCno
(3)连接查询:
selectStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
formStudentLEFTOUTERJOINSCon(Student.Sno=SC.Sno)
(4)嵌套查询:
selectSname,SagefromStudent
whereSage<
ALL(selectSagefromStudentwhereSdept='
CS'
)
andSdept<
>
'
;
(5)集合查询:
select*fromStudentwhereSdept='
exceptselect*fromStudentwhereSage<
=19;
(6)视图查询:
createVIEWS_G(Sno,Gavg)
asselectSno,avg(Grade)
fromSCgroupbySno;
selectSC.Sno,Cno,grade
fromSC,S_G
whereSC.Sno=S_G.SnoandGrade>
=S_G.Gavg
实验结果和分析
心得体会(遇到的问题和解决方法)
通过使用二分法与割线法求解方程,是我对所学的知识有了更深的了解,加深了对这两种方法的印象,同时也知道对于不同的问题应该采用不同的、适合的方法,才能更快更好的解决问题。
在编写二分法程序时,循环条件出错,使程序的运行结果无法停止,改变条件后,程序运行结果正常。
实验二线性方程组的直接求解
实验目的和要求
合理选择利用Gauss消元法、LU分解法、追赶法求解下列方程组:
①
②
③
④
实验内容
高斯消元法:
找到与原方程组等价的系数矩阵为三角形方正的方程组:
lik=aik/akk
aij=aij-lik*akj
k=1,2,…,n-1
i=k+1,k+2,…,nj=k+1,k+2,…,n+1
由回代过程求得原方程组的解:
xn=ann+1/ann
xk=(akn+1-∑akjxj)/akk(k=n-1,n-2,…,2,1)
LU分解:
如果A的各界顺序主子式不为0,则存在唯一的LU分解。
u1j=a1j,j=1,2,3,...,n
li1=ai1/u11,i=1,2,3,...,n
ukj=akj-∑lkiuij,j=k,k+1,...,n,k=2,3,...,n
lik=(aik-∑lijujk)/ukk,i=k+1,...,nj=1,...,k-1
追赶法:
矩阵A的LU分解中,矩阵L和U分别取下二对角线和上二对角线形式,求解Ax=b等价于解两个二对角线方程组Ly=b,Ux=y自上而下解方程组Ly=b形象地称为“追”,自下而上解方程组Ux=y称为“赶”。
笔记本计算机
Gauss消元法
#include"
stdio.h"
doublea[15][15],a0[15][15];
doubleb[15],b0[15],l[15];
intn;
inti,j;
voiddisplayA()
{
printf("
\n"
);
for(j=1;
j<
=n;
j++)
{
for(i=1;
i<
i++)
a[%d][%d]=%f"
j,i,a[j][i]);
b[%d]=%f\n"
j,b[j]);
}
for(j=1;
j++)
l[%d]=%f"
j,l[j]);
}
voidmain()
{inti,j,k;
scanf("
%d"
&
n);
for(i=1;
{
%lf"
a[i][j]);
a0[i][j]=a[i][j];
b[i]);
b0[i]=b[i];
displayA();
k=1;
do
if(i==k)continue;
l[i]=a0[i][k]/a0[k][k];
for(j=k+1;
j++)a[k][j]=a0[k][j]/a0[k][k];
b[k]=b0[k]/a0[k][k];
for(j=k+1;
a[i][j]=a0[i][j]-l[i]*a0[k][j];
b[i]=b0[i]-l[i]*b0[k];
displayA();
if(k==n)break;
k++;
}while
(1);
b[%2d]=%lf\n"
i,b[i]);
getch();
LU分解
#include<
stdio.h>
math.h>
#defineL30
doublea[L][L],b[L],l[L][L],u[L][L],x[L],y[L];
intmain()
intn,i,j,k,r;
++i)
++j)
{
l[i][j]=0;
u[i][j]=0.0;
for(k=1;
k<
++k)
for(j=k;
u[k][j]=a[k][j];
for(r=1;
r<
k;
++r)
u[k][j]-=l[k][r]*u[r][j];
for(i=k+1;
l[i][k]=a[i][k];
l[i][k]-=l[i][r]*u[r][k];
l[i][k]/=u[k][k];
l[k][k]=1.0;
y[i]=b[i];
i;
{y[i]-=l[i][j]*y[j];
for(i=n;
i>
0;
--i)
{x[i]=y[i];
for(j=i+1;
{x[i]-=u[i][j]*x[j];
x[i]/=u[i][i];
for(i=1;
%0.2lf\n"
x[i]);
追赶法
main()
doublea[15],b[15],c[15],d[15];
doublet;
inti,n;
%lf%lf%lf"
b[1],&
c[1],&
d[1]);
for(i=2;
=n-1;
%lf%lf%lf%lf"
a[i],&
b[i],&
c[i],&
d[i]);
a[n],&
b[n],&
d[n]);
c[1]=c[1]/b[1];
d[1]=d[1]/b[1];
t=b[i]-c[i-1]*a[i];
c[i]=c[i]/t;
d[i]=(d[i]-d[i-1]*a[i])/t;
d[n]=(d[n]-d[n-1]*a[n])/(b[n]-c[n-1]*a[n]);
for(i=n-1;
=1;
i--)d[i]=d[i]-c[i]*d[i+1];
\n********************************\n"
d[%2d]=%lf\n"
i,d[i]);
使用直接法求解线性方程组中,系数矩阵A的主元素不为0,即可使用高斯消元法,如果A的各阶主子式不为0,则存在唯一的LU分解。
追赶法是把高斯消元法用到求解三对角线方程组上,计算量较小。
在编写程序时,首先必须的对高斯消元法,LU分解,追赶法有比较详细的了解,知道每一步该怎么做,要有具体的框架,然后在开始编写程序。
同时要注意赋值符号是==,而不是=。
并且调用的函数要写在主函数之前。
实验三线性方程组的迭代求解
使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。
雅可比迭代:
设线性方程组Ax=b的系数矩阵A可逆,且主对角元a11,a22,…,ann均不为零,令D=diag(a11,a22,…,ann)并将A分解成A=(A-D)+D从而线性方程组可写成Dx=(D-A)x+b则有迭代公式x(k+1)=B1x(k)+f1
高斯赛德尔迭代:
把矩阵A分解成A=D-L-U。
其中D=diag(a11,a22,…,ann),-L,-U分别为A的主对角元素除外的下三角和上三角部分,从而线性方程组可写成(D-L)x=Ux+b,即x=B2x+f2,则有迭代公式x(k+1)=B2x(k)+f2
雅可比迭代
floata[3][3]={{10,-1,-2},{-1,10,-2},{-1,-1,5}},b[3]={7.2,8.3,4.2};
floatx[3]={0,0,0},sum1;
inti,j,k,n=3;
for(k=0;
10;
k++){
for(i=0;
3;
sum1=0;
for(j=0;
n;
if(i==j)continue;
sum1=sum1+a[i][j]*x[j];
x[i]=(b[i]-sum1)/a[i][i];
{printf("
x[%d]=%f,"
i+1,x[i]);
高斯赛德尔迭代
floatx[3]={0,0,0},sum1,sum2;
k++)
sum2=0;
for(j=i+1;
sum2=sum2+a[i][j]*x[j];
x[i]=(b[i]-sum1-sum2)/a[i][i];
getch();
雅可比迭代法公式简单,每迭代一次只需计算一次矩阵和向量的乘法,需存放x(k+1),x(k)
高斯赛德尔迭代在计算机运行时只需一组存储单元,而且可以较好的利用x(k+1),在一定条件下高斯赛德尔迭代比雅可比迭代法收敛的快。
在编写程序时要认真、细心,每一个语句的括号要相匹配,有时候在嵌套语句较多时,要注意每一个括号,缺少括号会使运行结果错误。
在定义变量时,要记得赋初值。
实验四代数插值和最小二乘法拟合
代数插值
使用拉格朗日插值法或牛顿插值法求解:
已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。
x
0.40
0.55
0.65
0.80
0.90
1.05
f(x)
0.41075
0.57815
0.69675
0.88811
1.02652
1.25386
最小二乘法拟合多项式
给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。
xi
0.5
0.6
0.7
0.8
0.9
1.0
yi
1
1.75
1.96
2.19
2.44
2.71
3.00
设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n
令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)
其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足
Ln(xj)=yj,L=0,1,…,n
再由插值多项式的唯一性,得Pn(x)≡Ln(x)
建立正规方程组:
∑(∑xij+k)ak=∑xijyi,j=0,1,…,n
平方误差:
I=∑(∑akxik-yi)2
代数差值
stdlib.h>
conio.h>
voiddifference(float*x,float*y,intn)
loat*f;
intk,i;
f=(float*)malloc(n*sizeof(float));
for(k=1;
k++)
f[0]=y[k];
i++)
f[i+1]=(f[i]-y[i])/(x[k]-x[i]);
y[k]=f[k];
}
return;
intmain()
floatx[20],y[20],xx,yy;
请输入数据个数n:
"
x[%d]="
i);
%f"
x[i]);
y[%d]="
y[i]);
}
difference(x,(float*)y,n);
请输入插值xx:
xx);
yy=y[20];
=0;
i--)
yy=yy*(xx-x[i])+y[i];
\n近似值为:
(%f)=%f\n"
xx,yy);
最小二乘法
math.h"
#definenum10
floatneiji(floatb[num],floatc[num])/*内积函数*/
intp;
floatnj=0;
for(p=1;
p<
num;
p++)
nj+=c[p]*b[p];
returnnj;
floatpower(float&
a,intn)
floatb=1;
for(inti=0;
b*=a;
returnb;
floatx[num],y[num],sumX[num],sumY[num];
inti,j,n,index;
charconti;
FILE*f;
conti='
;
请输入已知点的个数n=\n"
请输入x和y:
sumX[1]=sumY[1]=0;
printf("
scanf("
sumX[1]+=x[i];
sumY[1]+=y[i];
sumX[1]=%f"
sumX[1]);
sumY[1]=%f"
sumY[1]);
请输入拟和次数="
index);
i=n;
sumX[0]=i;
=2*index;
for(j=1;
{
sumX[i]+=power(x[j],i);
}
sumX[%d]=%f"
i,sumX[i]);
=index+1;
sumY[i]+=power(x[j],i-1)*y[j];
sumY[%d]=%f"
i,sumY[i]);
f=fopen("
Gaussdata.txt"
"
w"
fprintf(f,"
%i\n"
index+1);
=index;
for(j=i;
=index+i;
fprintf(f,"
%f"
sumX[j]);
fprintf(f,"
%f\n"
sumY[i+1]);
fclose(f);
//利用求解线性方程组的方法求解…
利用插值法寻求近似函数并计算近似值使求解变得简单,并且只要求在插值节点上,插值函数与被插函数的函数值相等。
在曲线拟合中采用误差平方和来度量误差的整体大小。
寻求与给定点(xi,yi)(i=0,1,…,m)的距离平方和为最小的曲线y=p(x).函数p(x)称为拟合函数或最小二乘解。
通过本次实验使自己在理论知识的基础上加以实践,加深对代数插值和最小二乘法拟合的理解。
在调试程序时经常会因为一些小的错误导致程序不能正常运行,这时需要仔细检查程序。
总的来说,在整个实验的过程中,使自己对所学的知识有了进一步的巩固,也学会了用简单的方法求解函数。