数值计算方法课程设计学号班级实验要求1.应用自己熟悉的算法语言编写程序,使之尽可能具有通用性。
2.上机前充分准备,复习有关算法,写出计算步骤,反复检查,调试程序。
(注:在练习本上写,不上交)3.完成计算后写出实验报告,容包括:所用的算法语言,CPU时间,算法步骤叙述,变量说明,程序清单,输出计算结果,结构分析和小结等。
(注:具体题目具体分析,并不是所有的题目的实验报告都包含上述容!)4.至少需要选择5道必做题目。
其余的也可以选择,如果多选,可酌情加分!5.独立完成,如有雷同,一律判为零分!6.上机期间不允许做其他任何与课程设计无关的事情,否则被发现一次扣10分,被发现三次判为零分!上机实习题目1. 编写九韶算法程序,并用该程序计算多项式623)(35+-+=x x x x f 在1.3 1.2, ,1.1=x 的值。
public class Qinjiushao {public double result;public double x=-2;//定义一个未知数xpublic double[] b;public double[] c;public int i;public String abc;public void calculate(){// abc="x^5+3*x^3-2*x+6";多项式,可以截取字符串获取系数double[] a={2,0,-3,3,-4};//多项式的系数double[] b=new double[a.length];double[] c=new double[b.length];for(i=0;i<a.length;i++){if(i==0){c[i]=b[i]=a[i];}else{b[i]=b[i-1]*x+a[i];c[i]=c[i-1]*x+b[i-1]*x+a[i];}}int j=a.length-1;System.out.println("结果值为:f("+x+")="+c[a.length-2]);}public static void main(String[] agrs){Qinjiushao qjs=new Qinjiushao();qjs.calculate();//JFrame jframe=new JFrame();//jframe.setTitle("求结果");//jframe.setSize(400,400);//jframe.setVisible(true);}}2. 用选列主元高斯消去法解线性方程组⎪⎪⎩⎪⎪⎨⎧=+-=-+-=-+-=--022 0 21 34343232121x x x x x x x x x x #include<stdio.h>#include<math.h>#define N 4void maxij(double (*table)[N+1],int m);void zeros(double (*table)[N+1],int m);double solution(double (*table)[N+1],double *A,int n);main(){double table[N][N+1]={{-3,-1,0,0,1},{-1,2,-1,0,0},{0,-1,2,-1},{0,0,-1,2,0}}; double A[N];int i,j,m,n;for(m=0;m<N;m++){maxij(table,m);zeros(table,m);}for(n=N-1;n>=0;n--){if(table[n][n]!=0)A[n]=solution(table,A,n);elseA[n]=0;}for(i=0;i<N;i++)printf("x%d=%g\n",i+1,A[i]);}double solution(double (*table)[N+1],double *A,int n){double sum=0,result;int p;for(p=N-1;p>n;p--)sum+=table[n][p]*A[p];result=(table[n][N]-sum)/table[n][n];return result;}void zeros(double (*table)[N+1],int m){double zeroing;int i,j;for(i=m+1;i<N;i++)if(table[i][m]!=0){zeroing=-1*table[i][m]/table[m][m];table[i][m]=0;for(j=m+1;j<=N;j++)table[i][j]+=table[m][j]*zeroing;}}void maxij(double (*table)[N+1],int m){double exchange;int i,j,line=m;for(i=m;i<N;i++)if(abs(table[line][m])<abs(table[i][m]))line=i;for(i=m;i<=N;i++){exchange=table[m][i];table[m][i]=table[line][i];table[line][i]=exchange;}}运行结果:x1=-0.266667,x2=-0.2,x3=-0.133333,x4=-0.06666673. 分别用平方根法和改进平方根法解线性方程组⎪⎩⎪⎨⎧=++=++-=+-631242321321321x x x x x x x x x平方根法解线性方程组Ax =b#include"math.h"#include"stdio.h"main(){int i,j,k;int n=3;float m,a[3][3],b[3],x[3],l[3][3],y[3];printf("input matrix numbers of a:\n");for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%f",&a[i][j]);printf("\n");printf("input numbers of b:\n");for(i=0;i<n;i++)scanf("%f",&b[i]);printf("\n");l[0][0]=sqrt(a[0][0]);for(i=1;i<n;i++){l[i][0]=a[i][0]/l[0][0];l[0][i]=l[i][0];}for(j=1;j<n;j++){m=0.0;for(k=0;k<j;k++){m+=l[j][k]*l[j][k];l[j][j]=sqrt(a[j][j]-m);}for(i=j+1;i<n;i++){m=0.0;for(k=0;k<j;k++){ m+=l[i][k]*l[j][k];l[i][j]=(a[i][j]-m)/l[j][j];l[j][i]=l[i][j];}}}y[0]=b[0]/l[0][0];for(i=1;i<n;i++){m=0.0;for(k=0;k<i;k++){m+=l[i][k]*y[k];y[i]=(b[i]-m)/l[i][i];}}x[n-1]=y[n-1]/l[n-1][n-1]; for(i=n-2;i>=0;i--){m=0.0;for(k=i+1;k<n;k++){m+=l[k][i]*x[k];x[i]=(y[i]-m)/l[i][i];}}for(i=0;i<n;i++)printf("x(%d)=%f\n",i,x[i]); }结果用C语言实现改进平方根法,程序代码如下:#include "stdlib.h"#include "stdio.h"#include "conio.h"#include "string.h"#include "math.h"#define N 100float Table(int n,float a[N][N],float b[N]){int i,j;printf("Please input the matrix A by row!\n");for(i=0;i<n;i++){printf("Row %d:",i);for(j=0;j<n;j++)scanf("%f",&a[i][j]);}printf("Please input the array b:");for(i=0;i<n;i++)scanf("%f",&b[i]);printf("\nThe matrix A and array b:\n");for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%10.4f",a[i][j]);printf("%10.4f",b[i]);printf("\n");}return 0;}float decomposition(int n,float a[N][N],float l[N][N],float d[N][N]) {int i,j,k;float t[N][N],tmp1,tmp2;for(i=0;i<n;i++)for(j=0;j<n;j++){if(i!=j) d[i][j]=0;if(i<j){t[i][j]=0;l[i][j]=0;}if(i==j) l[i][j]=1;}d[0][0]=a[0][0];for(i=1;i<n;i++)for(j=0;j<i;j++){tmp1=0;for(k=0;k<j;k++)tmp1+=t[i][k]*l[j][k];t[i][j]=a[i][j]-tmp1;l[i][j]=t[i][j]/d[j][j];tmp2=0;for(k=0;k<i;k++)tmp2+=t[i][k]*l[i][k];d[i][i]=a[i][i]-tmp2;}printf("\nAfter Cholesky triangular decomposition, the matrix L:\n");for(i=0;i<n;i++)for(j=0;j<=i;j++){printf("%8.4f",l[i][j]);if(i==j) printf("\n");}printf("\nAnd the matrix D:\n");for(i=0;i<n;i++)for(j=0;j<=i;j++){if(i!=j)for(k=0;k<8;k++)printf(" ");if(i==j) printf("%8.4f\n",d[i][j]);}return 0;}float solve(int n,float l[N][N],float d[N][N],float b[N]){int i,j,k;float y[N],x[N],tmp1,tmp2;y[0]=b[0];for(i=1;i<n;i++){tmp1=0;for(k=0;k<i;k++)tmp1+=l[i][k]*y[k]; y[i]=b[i]-tmp1;}4.考虑n 阶三对角方程组⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧⎪⎪⎪⎪⎭⎪⎪⎪⎪⎬⎫=⎪⎪⎪⎪⎭⎪⎪⎪⎪⎬⎫⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧3443 2 1 1 2 11 2 1 1 2 x ,,300=n (1) 用选列主元高斯消去法求解,(2) 编写追赶法程序并求解,a=(float *)malloc((n+1)*sizeof(float)); b=(float *)malloc((n+1)*sizeof(float)); c=(float *)malloc((n+1)*sizeof(float)); d=(float *)malloc((n+1)*sizeof(float)); q=(float *)malloc((n+1)*sizeof(float)); p=(float *)malloc((n+1)*sizeof(float)); x=(float *)malloc((n+1)*sizeof(float));}void get_num(){int i;printf("请输入系数a[2]-a[%d]\n",n);for(i=2;i<=n;i++)scanf("%f",&a[i]);a[1]=0;printf("请输入系数b[1]-b[%d]\n",n);for(i=1;i<=n;i++)scanf("%f",&b[i]);printf("请输入系数c[1]-c[%d]\n",n-1);for(i=1;i<=n-1;i++)scanf("%f",&c[i]);printf("请输入系数d[1]-d[%d]\n",n);for(i=1;i<=n;i++)scanf("%f",&d[i]);}void work()int i=0,k;float t;a[1]=c[n]=0;p[1]=d[1]/b[1];q[1]=c[1]/b[1];//初始化for(k=2;k<=n;k++){t=b[k]-a[k]*q[k-1];p[k]=(d[k]-a[k]*p[k-1])/t;q[k]=c[k]/t;}//对原三对角方程组进行顺序消元,且每步都吧主元素系数化为1x[n]=p[n];for(k=n-1;k>=1;k--)x[k]=p[k]-q[k]*x[k+1];//回代求解}int main(){//freopen("in.txt","r",stdin);int i=0;print1();printf("请输入方程阶数\n");scanf("%d",&n);get_array();(3) 比较两种方法的计算时间和精度。