计算机实习任务报告
C语言编程计算
实习报告
酒店前台实习报告法院实习报告铁路实习报告链家实习报告寒假实习报告
学号:
姓名:
班级:
专业:
2011年12月23
一、实习目的
通过16学时的计算机实习(C语言编程计算),掌握一种技能。 二、实习课题
31、用牛顿迭代法求在附近的实根,取四位有f(x),x,3x,1,0x,20
效数字。
、用高斯消去法求解下述线性方程组: 2
2x,x,x,4123
3x,4x,2x,11123
3x,2x,4x,11123
三、算法分析
?、牛顿迭代法
设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))作曲线y = f(x)的切线L,L的方程为y = f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。过点(x1,f(x1))作曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n),f(x(n))/f'(x(n)),称为r的n+1次近似值,上式称为牛顿迭代公式。 在程序中利用该迭代公式采用控制循环迭代次数得出方程的解。
?、高斯消去法
消元过程如下:
1.定出每列的最后一个非0的数,将每行的数字除以该数,使得每行的第一
个数成为1;
2.将每行的数字减去第一行的第一个数的某个倍数。
重复上述两个步骤直至增广矩阵变成一个行梯阵式,再用代入法就可以求得这个方程组的解。
在程序中用一维数组分别存储系数矩阵,常数项矩阵。
3高斯消元法的算法复杂度是O(n);这就是说,如果系数矩阵的是n × n,
3那么高斯消元法所需要的计算量大约与n成比例。对于较大的线性方程组,一般不会直接使用高斯消去法,而采用相应的迭代加速法。
四、程序
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
图
牛顿迭代法:
开始
输入&x0,maxcyc,precision
0=>k
Y k>maxcyc或
f’(x0)=0?
输出“迭代失败” N
x0-f(x0)/f’(x0)=>x1 结束
输出根x1
Y |x1-x0|
x0,k+1=>k
高斯消元法:
开始
3=>n,&pA,&pB,0=>k
pA[k*n+k]=>akk
Y pB[n-1]/pA[(n-1)*n+(n-1)]=> pX[n-1] akk=0? n-2=>k
N
pB[k]=>temp,k+1=>j k+1=>i,j
temp-(pA[k* n + j] * pX[j])=> temp pA[i*n+k]/akk=>mik
j+1=>j
pA[i * n + j]=> temp Y temp – mik * pA[k * n + j]=> pA[i * n + j] j temp N j+1=>j
temp / pA[k * n + k]=> pX[k] Y k-1=>k j=0?
temp - mik * pB[k]=> pB[i] 0=>pA[i * n + k] N
i+1=>i 输出根&pX
Y ik
Y N
k < n-1
五、程序运行结果截图
牛顿迭代法结果:
高斯消去法结果:
附:(源程序)
牛顿迭代法源程序Newton.cpp:
#include
#include
double func (double x) { //函数f(x)=x^3-3*x-1
return x*x*x-3*x-1; }
double func1(double x) { //导函数f'(x)=3*x^2-3
return 3*x*x-3.0; }
int Newton(double *x,double precision,int macyc)
{
double x1,x0;
int k;
x0=*x;
for (k=0;k
void GuassCommon(double *pA, double *pB, double *pX, int n)
{
double akk, mik, temp;
int k, i, j;
for (k = 0; k < n - 1; k++) //化成行阶梯形
{
akk = pA[k * n + k];
if (akk < 0.00001 && akk > -0.00001)
{
printf("\nError: a[k, k] = 0\n");
break;
}
for (i = k + 1 ; i < n; i++)
{
mik = pA[i * n + k] / akk;
for (j = k + 1; j < n; j++)
{
temp = pA[i * n + j];
pA[i * n + j] = temp - mik * pA[k * n + j];
temp = pB[i];
}
pB[i] = temp - mik * pB[k];
pA[i * n + k] = 0;
}
}
pX[n - 1] = pB[n - 1] / pA[(n - 1) * n + (n - 1)];
for (k = n - 2; k >= 0; k--) //求根
{
temp = pB[k];
for (j = k + 1; j < n; j++)
{
temp =temp- (pA[k * n + j] * pX[j]);
}
pX[k] = temp / pA[k * n + k];
}
}
int main()
{
int i, n;
double X[3]; //根矩阵
n = 3; //一个方程的系数个数
double A2[] = { //系数矩阵
2, -1, -1, 3, 4, -2, 3, -2, 4,
};
double B1[] = {
4, 11, 11, };
GuassCommon(A2, B1, X, n);
for (i = 0; i < n; i++) {
printf("X%d = %f\n", i + 1, X[i]); //输出根
}
return 0; }