华北电力大学科技学院数值计算方法上机报告.docx
《华北电力大学科技学院数值计算方法上机报告.docx》由会员分享,可在线阅读,更多相关《华北电力大学科技学院数值计算方法上机报告.docx(24页珍藏版)》请在冰豆网上搜索。
![华北电力大学科技学院数值计算方法上机报告.docx](https://file1.bdocx.com/fileroot1/2023-1/3/8d65a618-e92a-41e0-bc81-722795e84237/8d65a618-e92a-41e0-bc81-722795e842371.gif)
华北电力大学科技学院数值计算方法上机报告
华北电力大学科技学院数值计算方法上机报告
华北电力大学科技学院
数值计算方法上机报告
姓名:
G&P
班级:
农电12K1
学号:
2014年11月28日
实验程序为
实验一
#include"stdio.h"
#include"math.h"
#defineN30
voidmain()
{
inti;
floatx[N],c;
scanf("%f",&c);
scanf("%f",&x[0]);//初值
printf("****倒数表****\n");
for(i=0;i{
x[i+1]=x[i]*x[i]*c/(2*c*x[i]-1);
printf("k=%d\tx(%d)=%.5f\n",i,i,x[i]);
if(fabs(x[i+1]-x[i])<=0.0005)
break;
else
continue;
printf("k=%d\tx(%d)=%.5f\n",i+1,i+1,x[i]);
printf("\n计算结果:
\n1/%f=%.3f\n\n",c,x[i+1]);
}
}
实验二#include"stdio.h"
#include"math.h"
#defineN10
voidmain()
{inti,j,k,l,n;
floatb[N],a[N][N],t,d,det=1.0;
//***数据输入*/
printf("输入n\n");
scanf("%d",&n);
printf("输入Ai\n");
for(i=0;ifor(j=0;jscanf("%f",&a[i][j]);
printf("输入bi\n");
for(i=0;iscanf("%f",&b[i]);
//***数据输入*/
//***************************高斯消去*/
//************************消元*/
//****************************列选主元函数*/
for(k=0;k{
d=a[k][k];l=k;
for(i=k+1;i{
if(fabs(a[i][k])>fabs(d))
{d=a[i][k];i=l;}
}
if(i==n)//判断是否奇异,不奇异进行行交换
{
if(d==0)
printf("奇异");//如果所有行的"首列"都为0,为奇异
else
{
if(l!
=k)//如果第k行的"首列"并不是最大
{
det=det*(-1);
for(j=k;j<=n;j++)//交换系数矩阵中的两行
{t=a[l][j];a[l][j]=a[k][j];a[k][j]=t;}
t=b[l];b[l]=b[k];b[k]=t;//交换右端常向量中的两行
}
}
}
//************列选主元函数*/
for(i=k+1;i{
a[i][k]=a[i][k]/a[k][k];
for(j=k+1;j{
a[i][j]=a[i][j]-a[i][k]*a[k][j];
}
b[i]=b[i]-a[i][k]*b[k];//右端常向量
}
}
//*****************消元*/
//*回代*/
b[n-1]=b[n-1]/a[n-1][n-1];//计算x(N)的解
for(i=n-2;i>=0;i--)//从倒数第二项开始依次回代N-1次
{
t=0;
for(j=i+1;j{t=t+a[i][j]*b[j];}
b[i]=(b[i]-t)/a[i][i];
}
//*************高斯消去*/
//*******************数据输出*/
for(i=0;iprintf("x(%d)=%.4f\n",i+1,b[i]);
for(i=0;idet=det*a[i][i];
printf("detA=%.4f\n",det);//输出系数矩阵行列式的值
//**********************数据输出*/
}
实验三//例3-10
#include"iostream"
#include"cmath"
#defineN30
voidmain()
{
inti,j,r,k,n;
floata[N][N]={0},s;
//***数据输入*/
printf("输入n\n");
scanf("%d",&n);
printf("输入矩阵\n");
for(i=0;ifor(j=0;jscanf("%f",&a[i][j]);
for(i=0;i{
j=i+n;
a[i][j]=1;
}
//***数据输入*/
//***************************LU分解*/
for(i=1;i"1"区间不变化,"2"区间变化。
a[i][0]=a[i][0]/a[0][0];
for(i=1;i{
for(j=i;j<2*n;j++)//第"2(r+1)-1"区间的变化行
{
s=0.0;
for(k=0;k
s+=a[i][k]*a[k][j];
a[i][j]=a[i][j]-s;
}
for(j=i+1;j{
s=0.0;
for(k=0;k
s+=a[k][i]*a[j][k];
a[j][i]=(a[j][i]-s)/a[i][i];
}
}//现在已将AI--->LUY
//**************************************LU分解*/
//************************************高斯约当法解Ux=Y*/
//********************提取UY减少计算*/
for(i=1;ifor(j=0;j
//*************************提取UY减少计算*/
//***************消元*/
for(j=0;j<2*n;j++)//首行归一化
{
a[0][j]=a[0][j]/a[0][0];
}
a[0][0]=1;//第一列其余行已为零
for(i=1;i{
for(j=i+1;j<2*n;j++)//第i+1行的各列进行归一化
a[i][j]=a[i][j]/a[i][i];
a[i][i]=1;
for(r=0;r
{
for(j=r+2;j<2*n;j++)//r行的各列与第r+1行的对应列进行减法运算
a[r][j]=a[r][j]-a[i][j]*a[r][r+1];//第r+1行归一后,乘数即为要置零处的值
a[r][r+1]=0;//乘数用完之后置零即可
}
}
//*****************************************消元*/
//********************高斯约当法解Ux=Y*/
//************************************数据输出*/
printf("A的逆矩阵为\n");
for(i=0;i{printf("|");
for(j=0;jprintf("%.4f",a[i][j+n]);
printf("|\n");
}
//************************************数据输出*/
}
实验四
//例4-6
#include"stdio.h"
#include"math.h"
#defineN50
intn,i,j,k;
floatxx=0.0,yy=0.0,t,x[N],y[N],c[N],A[N];
voidmain()
{printf("输入n\n");
scanf("%d",&n);//n=4
printf("输入x\n");
for(i=0;iscanf("%f,%f",&x[i]);
printf("输入f(x)\n");
for(i=0;iscanf("%f,%f",&y[i]);
printf("输入待求数\n");
scanf("%f",&xx);//要计算的值
for(k=0;k{
t=1.0;
for(j=0;jt=(xx-x[j])*t/(x[k]-x[j]);
for(j=k+1;jt=(xx-x[j])*t/(x[k]-x[j]);
yy=yy+t*y[k];
}
printf("\nx=%.7f处的函数值为:
y=%.7f\n",xx,yy);
}
实验五
//习题5-2
#include"stdio.h"
#include"math.h"
#defineN30
voidmain()
{
inti,n,k,j,l;
floatx[N],y[N],z[N];//定义输入变量
floatAT[3][N];//定义A的转置
floatX[3][3],Y[3];//定义中间变量ATA和ATy
floats,t,d;
//***数据输入*/
printf("输入n:
\n");
scanf("%d",&n);
printf("依次输入X\n");
for(i=0;iscanf("%f",&x[i]);
printf("依次输入Y\n");
for(i=0;iscanf("%f",&y[i]);
printf("依次输入Z\n");
for(i=0;iscanf("%f",&z[i]);
//***数据输入*/
//
for(i=0;i{
AT[0][i]=1;
AT[1][i]=x[i];
AT[2][i]=y[i];
}
for(k=0;k<3;k++)//中间变量ATA
for(j=0;j<3;j++)
{
s=0.0;
for(i=0;is+=AT[k][i]*AT[j][i];
X[k][j]=s;
}
for(k=0;k<3;k++)//中间变量ATy
{
s=0.0;
for(i=0;i{s+=AT[k][i]*z[i];}
Y[k]=s;
}
//****************************计算
//*****************************************高斯消去*/
//*****************************************消元*/
//****************************列选主元函数*/
n=3;
for(k=0;k{
d=X[k][k];l=k;
for(i=k+1;i{
if(fabs(X[i][k])>fabs(d))
{d=X[i][k];i=l;}
}
if(i==n)//判断是否奇异,不奇异进行行交换
{
if(d==0)
printf("奇异");//如果所有行的"首列"都为0,为奇异
else
{
for(j=k;j<=n;j++)//交换系数矩阵中的两行
{t=X[l][j];X[l][j]=X[k][j];X[k][j]=t;}
t=Y[l];Y[l]=Y[k];Y[k]=t;//交换右端常向量中的两行
}
}
//****************************列选主元函数*/
for(i=k+1;i{
X[i][k]=X[i][k]/X[k][k];
for(j=k+1;j{X[i][j]=X[i][j]-X[i][k]*X[k][j];}
Y[i]=Y[i]-X[i][k]*Y[k];//右端常向量
}
}
//*****************************************消元*/
//*回代*/
Y[n-1]=Y[n-1]/X[n-1][n-1];//计算x(N)的解
for(i=n-2;i>=0;i--)//从倒数第二项开始依次回代N-1次
{
t=0;
for(j=i+1;j{t=t+X[i][j]*Y[j];}
Y[i]=(Y[i]-t)/X[i][i];
}
//***************************高斯消去*/
//****************************计算
printf("所求参数为:
\na=%.4f\nb=%.4f\nc=%.4f\n",Y[1],Y[2],Y[0]);
}