当前位置:文档之家› 数值计算方法课程设计(C语言)

数值计算方法课程设计(C语言)

数值计算方法课程设计姓名学号成绩课程实际报告实验一:秦九韶算法题目用选列主元高斯消去法解线性方程组⎪⎪⎩⎪⎪⎨⎧=+-=-+-=-+-=--0202 0 21 34343232121x x x x x x x x x x算法语言:利用c 语言的知识编写该算法程序算法步骤叙述:秦九昭算法的基思路是v[0]=a[0]*x+a[1] v[i]=v[i-1]*x+a[i+1];利用秦九昭算法计算多项式函数。

程序清单:#include <stdio .h >void main(){float a[5],x,sum;int i;printf("presase input the value of x=");scanf("%f",&x);for (i =5;i >=0;i --){printf("please input the value of a%d=",i); scanf("%f",&a[i]);}sum =a[5];for(i=5;i>=1;i--){sum=sum*x+a[i-1];}printf("f(x)=%f/n",sum); }输出结果计算:实验总结:通过运用C 语言,解决了秦九韶算法手写的复杂。

为以后的雪地打下基础。

实验二:用选列主元高斯消去法解线性方程组题目用选列主元高斯消去法解线性方程组⎪⎪⎩⎪⎪⎨⎧=+-=-+-=-+-=--022 0 21 34343232121x x x x x x x x x x算法步骤叙述第一步消元——在增广矩阵(A,b )第一列中找到绝对值最大的元素,将其所在行与第一行交换,再对(A,b )做初等行变换使原方程组的第一列元素除了第一行的全变为0;第二步消元——在增广矩阵(A,b )中第二列中(从第二行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A,b )做初等行变换使原方程组的第二列元素除了第一和第二行的全变为0;第三步消元——在增广矩阵(A,b )中第三列中(从第三行开始)找到绝对值最大的元素,将其所在行与第三行交换,再对(A,b )做初等行变换使原方程组的第三列第四行元素为0;第四,按x4-x3-x2-x1的顺序回代求解出方程组的解,x[n]=b[n]/a[n][n],x[i]=(b[i]-Σa[i][j]x[j])/a[i][i],i=n-1,…,2,1 程序清单:#include<iostream>#include<math>#define N 4static double A[N][N] = {-3,-1,0,0,-1,2,-1,0,0,-1,2,-1,0,0,-1,2}; static double B[N]={1,0,0,0};static double X[N];int i,j,k;void main(){for(k = 0; k < N-1 ;k++){int index = k;for(i = k; i< N ;i++){if(fabs(A[index][k]) < fabs(A[i][k])){index = i;}}double temp;for( i = k ; i < N ;i++ ){temp = A[index][i];A[index][i] = A[k][i];A[k][i] = temp;}temp = B[index];B[index] = B[k];B[k] = temp;for(i = k+1; i<N; i++){double T = A[i][k]/A[k][k];B[i] = B[i] - T * B[k];for ( j = k+1 ; j < N ; j++ ){A[i][j] = A[i][j] - T * A[k][j];}}}X[N-1] = B[N-1]/A[N-1][N-1];for (i = N-2; i >=0 ; i--){double Temp = 0;for (int j = i+1; j<N ;j++)Temp = Temp + A[i][j] * X[j];X[i] = (B[i] - Temp) /A[i][i];}cout << "线性方程组的解(X1,X2,X3......Xn )为:"<<endl;for( i = 0; i < N ;i++){cout << X[i] <<" ";}} 实验总结:通过c++语言的编写过程掌握高斯消元法及选列主元元素的技术,掌握了简单的c++程序编辑语言编写算法程序实验五:二分法与牛顿法题目用二分法和Newton 迭代法求下列方程的正根:要求结果的误差限为6105.0-⨯ ,05.01)1ln(22=---+-x x x x x1.二分法算法语言:C 语言算法思路:算法思路先给定区间[a,b],要求f(a)与f(b)是异号,保证区间内与x 轴有交点,求x=(a+b)/2,求f(x),检查f(x)与f(a)是否同号,如果是同号,把x 当成新的a ,否则把x 当成新的b ,得到新的区间,重复求a 和b 的中点的值,判断与f(a)是否同号,不断循环下去,直到达到精度为止。

3)牛顿迭代法设计思想是对f(x0)某点求切线,与x 轴交x1点后,把x1当成x0,再求出其相应新的f(x0),再对其求切线,找到与x 轴的新交点,不断循环下去,直到达到精度为止。

这种方法要求先对函数求一阶导数,然后再迭代:x1=x0-f(x0)/f‘(x0)程序清单:#include<stdio.h>#include <math.h>#define f(x) (x*log(sqrt(x*x-1)+x)-sqrt(x*x-1)-0.5*x)void main(){ float a,b,x,eps;int k=0;printf("intput eps\n");/* 0.5*10^-6 */scanf("%f",&eps);printf("a,b=\n");for(;;){scanf("%f, %f",&a ,&b);if(f(a)*f(b)>=0) /* 判断是否符合二分法使用的条件 */printf("二分法不可使用,请重新输入:\n");else break;}do{ x=(a+b)/2;k++;if(f(a)*f(x)<0) /* 如果f(a)*f(x)<0,则根在区间的左半部分 */b=x;else if(f(a)*f(x)>0) /* 否则根在区间的右半部分 */a=x;else break;}while(fabs(b-a)>eps);/*判断是否达到精度要求,若没有达到,继续循环*/x=(a+b)/2; /* 取最后的小区间中点作为根的近似值 */printf("\n The root is x=%f, k=%d\n",x,k);}输出结果计算:2.牛顿法算法思路:设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的一次近似值,如果|f(x1)-0|小于指定的精度,那么继续过点(x1,f(x1))做曲线y=f(x)的切线,并求该切线与x轴的横坐标x2=x1-f(x1)/f'(x1)称x2为r的二次近似值,重复以上过程。

得r的近似值序列{Xn},其中Xn 1=Xn-f(Xn)/f'(Xn),称为r的n 1次近似值。

程序清单:#include <stdio.h>#include <math.h>float f(float x) /* 定义函数f(x) */ {return (x*log(sqrt(x*x-1)+x)-sqrt(x*x-1)-0.5*x);}float f1(float x) /* 定义函数f(x)的导数*/{ return x*log(sqrt(x*x-1)+x))-(sqrt(x*x-1)-0.5*x) ; }void main(){ float eps,x0,x1=1.0;printf("input eps:\n");scanf("%f",&eps); /* 输入容许误差*/do{ x0=x1; /* 准备下一次迭代的初值 */x1=x0-f(x0)/f1(x0); /* 牛顿迭代 */}while(fabs(x1-x0)>eps); /*当满足精度,输出近似根*/printf("x=%f\n",x1);}总结:了解和掌握二分法和牛顿迭代的算法思路,学会利用简单的编程语言编写牛顿和二分法的算法思路,并作简单的计算。

实验八:应用经典的四阶龙格库塔方法求Lorenz 方程题目:应用经典的四阶龙格库塔方法求Lorenz 方程要求:参数,初值0)0(,0)0(,0)0(321===x x x ,步长1.0=h .程序设计:Lorenz 方程实际上是一个四元一阶常微分方程,用解析法精确求解是不可能的,只能用数值计算,最主要的有欧拉法、亚当法和龙格- 库塔法等。

为了得到较高精度的数值解,本实验要求采用经典四阶龙格—库塔方法求解该问题。

程序清单:#include <stdio.h>float func(float x,float y){ return(x-y);}float runge_kutta(float x0,float xn,float y0,int N){ float x,y,y1,y2,h,xh;float d1,d2,d3,d4;int i;x=x0;y=y0;h=(xn-x0)/(float)N;for(i=1;i<=N;i++){ xh=x+h/2;d1=func(x,y);d2=func(xh,y+h*d1/2.0);d3=func(xh,y+h*d2/2.0);d4=func(xh,y+h*d3);y=y+h*(d1+2*d2+2*d3+d4)/6.0;x=x0+i*h; }return(y);}main(){ float x0,xn,y0,e;int N;printf("输入步长 n:\n "); scanf("%d",&N);printf("输入参数 x0,xn:\n "); scanf("%f,%f",&x0,&xn);printf("输入初值 y0:\n "); scanf("%f",&y0);e=runge_kutta(x0,xn,y0,N);printf("y(%f)=%8.6f",y0,e);}输出结果计算:总结:本实验通过龙格——库塔法对Lorenz方程进行了分析,从本实验中我们得出,Lorenz方程的解对初始变量具有很强烈的敏感性。

相关主题