计算方法实验(c语言_六项试验)
计算方法实验

电子信息工程学院通信工程专业、电子信息工程专业《计算方法实验》教学大纲一、课程概述(一)课程性质本课程是通信工程专业非常重要的基础选修课。
《计算方法实验》是《计算方法》课程的有效补充部分。
通过实验,可以使学生更好地掌握所学理论,能够把理论和实际编程更好地结合起来,从而达到提高学生的实际上机操作能力和程序编写的能力。
在引导学生使用计算机开展数值试验,掌握数值算法和程序设计的基本原理和技能。
学生通过选择算法,编写程序,分析数值结果,写数值实验报告,课堂讨论等环节的综合训练,从而逐步掌握数值试验的方法和技巧,获得多方面的计算经验。
(二)教学目标与要求通过本实验课程的学习,学生应掌握以下知识和技能:1.计算方法中基本算法的程序设计(使用MA TLAB);2.程序设计和调试的基本技能;3.注意提示学生算法中参数的调整;4.结合专业课程应用。
(三)重点和难点本课程教学重点:1、MA TLAB矩阵运算、M文件编写,符号运算和图形绘制。
2、程序实现插值法。
用插值法计算三角函数表和平方根表中没有列出的函数值。
程序实现曲线拟合。
3、程序实现解线性方程组的高斯消去法、雅可比迭代法和塞德尔迭代法。
程序实现解非线性方程的牛顿迭代法、弦截法。
(四)与其他课程的关系本课程是一门应用性较强的课程,要求学生具备一定的计算机操作能力,并至少学过一门计算机语言,例如《MA TLAB》或《C语言程序设计》。
先修课程:《MA TLAB》或《C语言程序设计》、《高等数学》、《线性代数》。
本课程的学习,可为学生学好很多后续课程奠定基础,例如《数字信号处理》,《数字图像处理》,《信号与系统》,《通信原理》等工程实际性较强的专业基础课,专业课提供仿真工具。
(五)教材及教学参考书教材:《计算方法》,徐萃薇,高等教育出版社,2003.7参考书:《MATLAB7.X程序设计》,楼顺天,西安电子工业出版社,2006.5《数值分析与实验》,薛毅编著,北京工业大学出版社,2005.3《计算方法》(上,下)北京大学、清华大学《计算方法》编写组,科学出版社。
c语言综合实验报告

c语言综合实验报告《C语言综合实验报告》一、实验目的本次实验旨在通过综合性的C语言编程实践,加深学生对C语言程序设计的理解和掌握,提高学生的编程能力和解决问题的能力。
二、实验内容1. 编写一个简单的C语言程序,实现对用户输入的两个整数进行加法运算并输出结果。
2. 设计一个C语言程序,实现对用户输入的字符串进行逆序输出。
3. 编写一个C语言程序,实现对用户输入的一组整数进行排序并输出排序后的结果。
4. 设计一个C语言程序,实现对用户输入的一组学生成绩进行统计,包括平均分、最高分、最低分等。
三、实验过程1. 首先,对于加法运算的程序,我们使用scanf函数获取用户输入的两个整数,然后利用printf函数输出它们的和。
2. 对于字符串逆序输出的程序,我们使用gets函数获取用户输入的字符串,然后使用循环和数组实现逆序输出。
3. 对于排序程序,我们使用冒泡排序算法对用户输入的整数进行排序,并使用printf函数输出排序后的结果。
4. 对于学生成绩统计程序,我们使用循环获取用户输入的学生成绩,并计算平均分、最高分、最低分等统计信息,最后使用printf函数输出结果。
四、实验结果经过以上步骤,我们成功编写了四个C语言程序,分别实现了加法运算、字符串逆序输出、整数排序和学生成绩统计等功能。
这些程序在实际运行中均能正常工作,并得到了预期的结果。
五、实验总结通过本次实验,我们深入理解了C语言的基本语法和编程思想,掌握了常见的编程技巧和算法,并提高了自己的编程能力和解决问题的能力。
希望在今后的学习和工作中能够继续努力,不断提升自己的编程水平,为实现更多的创新和突破打下坚实的基础。
C语言实验报告范文

C语言实验报告范文一、实验目的本实验旨在通过实际操作和编程,加深对C语言的理解和掌握,同时提高解决实际问题的能力。
二、实验内容1.利用C语言设计一个简单的计算器程序,实现简单的四则运算功能。
2.利用C语言设计一个简单的学生信息管理系统,实现添加、删除、修改和查询学生信息的功能。
三、实验步骤和代码实现1.计算器程序的设计与实现(1) 定义一个函数addition,传入两个参数,实现两数相加。
(2) 定义一个函数subtraction,传入两个参数,实现两数相减。
(3) 定义一个函数multiplication,传入两个参数,实现两数相乘。
(4) 定义一个函数division,传入两个参数,实现两数相除。
(5)在主函数中,通过用户的输入选择所需进行的运算,并输出结果。
代码如下:```C#include <stdio.h>float addition(float a, float b)return a + b;float subtraction(float a, float b)return a - b;float multiplication(float a, float b)return a * b;float division(float a, float b)if (b == 0)printf("Divisor cannot be zero!\n");return 0;}return a / b;int maiint choice;float num1, num2;printf("Please enter two numbers: ");scanf("%f%f", &num1, &num2);printf("Please choose the operation (1:addition, 2:subtraction, 3:multiplication, 4:division): ");scanf("%d", &choice);switch (choice)case 1:printf("The result is: %.2f\n", addition(num1, num2)); break;case 2:printf("The result is: %.2f\n", subtraction(num1, num2)); break;case 3:printf("The result is: %.2f\n", multiplication(num1, num2)); break;case 4:printf("The result is: %.2f\n", division(num1, num2)); break;default:printf("Invalid choice!\n");break;}return 0;```2.学生信息管理系统的设计与实现(1) 定义一个结构体Student,包含学生的姓名、学号、年龄等信息。
计算方法实验计算机科学与技术

实验一 非线性方程的迭代数值解法一、实验目的1) 熟悉用牛顿法解非线性方程的过程;熟悉用弦截法求解非线性方程的过程 2) 编程实现牛顿法、弦截法求非线性方程的根。
二、实验设备PC 机一台,C 语言、PASCAL 语言、Matlab 任选 三、实验内容1)用牛顿法求解01553=-x 的根,取初始值为10。
2) 用弦截法求解数学方程。
010*15.110*4.181.9*002.0)(255.15=--=--x x x f四、实验要求1)认真分析题目的条件和要求,复习相关的理论知识,选择适当的解决方案和算法; 牛顿迭代法:是用于求方程或方程组近似根的一种常用的算法设计方法。
设方程为f(x)=0,用某种数学方法导出等价的形式 x(n+1) = x(n)–f(x(n))/f ’(x(n)).然后按以下步骤执行: (1) 选一个方程的近似根,赋给变量x1;(2) 将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;(3) 当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。
若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就 认为是方程的根。
弦截法:弦截法求方程的根是一种解方程得基本方法,在计算机编程中常用。
他的思路是这样的:任取两个数,判断这两个数的函数值,如果函数值是同号,换两个数再试,直到两个数x1,x2对应的函数值为异号时为止,这时方程的解肯定在这两个数x1,x2之间。
连接这两点所对应的函数值,连线与x 轴的交点为新的x ,若f(x)与f(x1)同号,则把x 当作新的x1,将新的x1与x2连接,如此循环……如果f(x)与f(x1)异号,则把把x 当作新的x2,将x1与新的x2连接,循环……本实验在操作之前对构造方程的函数,分别进行了一阶和二阶求导。
二阶导数恒小于零。
2)编写上机实验程序,作好上机前的准备工作;牛顿迭代法求解/*计算pow(x,3)-155=0的根 用牛顿迭代法*/ #include <stdio.h> #include <math.h> double fy(double x){ return pow(x,3)-155; }double fd(double x){ return 3*pow(x,2);}void main(){ int i=1;double x0=10,x=0;printf("The initial x is %.5lf\n\n",x0);for(i=1;i<50;i++){x=x0-fy(x0)/fd(x0);if(fabs(x-x0)<1e-5) break;x0=x;printf("The %d the x is %.5lf\n",i,x0);}}============================================================= 弦截法求解求解数学方程的根0.002*9.81-1.4*e-5*X1.5-1.15*e-5*X2=0/*求解数学方程的隔根区间f(X)=0.002*9.81-1.4*e-5*X1.5-1.15*e-5*X2=0f'(X)=-1.4*e-5*(1.5)*X0.5-1.15*e-5*(2)X ?? 0f''(X)=-1.4*e-5*(1.5*0.5)X(-0.5)-1.15*e-5*(2)<0*/#include <stdio.h>#include <math.h>#define N 0.5double f(double x){ double f;f=0.002*9.81-1.4*0.00001*pow(x,1.5)-1.15*0.00001*pow(x,2);return f;}void main(){int i;double Initial=36;double a,b,fa,fb;printf("i\ta\t f(a)\t\tb\t\tf(b)\tf(a)*f(b)\n");for(i=1;;i++){ a=Initial-N*i;b=Initial+N*i;fa=f(a);fb=f(b);printf("%d\t%lf %lf\t%lf %lf\t%lf\n",i,a,fa,b,fb,fa*fb);if(fa*fb<0) break;}printf("The last :\n");printf("%d\t%lf\t%lf\t%lf\t%lf\n",i,a,fa,b,fb);}/* 用弦截法求解数学方程。
计算机软件基础实验报告(C语言)

计算机软件基础实验报告一.实验目的1.熟悉C语言的使用,编辑算法实现特定要求。
2.熟悉Huffman树的编码程序和数组元素的比较程序等。
二.实验内容和要求1.实验内容1)试设计一算法,从包括n个元素的数组中,求最大和最小元素,并使得当n 个元素为有序排列时,元素之间的比较次数仅为n-1次。
2)在给出的Huffman编码源程序基础上,要求画出Huffman树,求出与等长编码相比时的压缩比。
2.实验要求1)根据实验内容编写算法,并用 C 语言进行程序设计。
2)将所编程序在计算机上调试通过,并全面测试。
3)整理完成实验报告,包括:姓名、学号、实验日期等。
三.程序清单1.#include<iostream.h>int main(){int n,max,min;cout<<"请输入数组大小"<<endl;cin>>n;int *a=new int [n];//输入数组for(int i=0;i<n;i++){cin>>a[i];}//比较排序for(int k=0;k<n-1;k++)for(int j=k+1;j<n;j++){if(a[k]>a[j]){int temp=0;temp=a[k];a[k]=a[j];a[j]=temp;}}//为最大值和最小值赋值max=a[n-1];min=a[0];//输出结果cout<<"排序后的序列"<<endl;for(int l=0;l<n;l++)cout<<" "<<a[l];cout<<endl;cout<<"max= "<<max<<" min= "<<min<<endl;return 0;}2.#include <dos.h>#include <conio.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>typedef struct{unsigned int weight; //结点权值unsigned int parent,lchild,rchild; //结点的父指针,左右孩子指针}HTNode,*HuffmanTree; //动态分配数组存储哈夫曼树typedef char **HuffmanCode; //动态分配数组存储哈夫曼编码表void CreateHuffmanTree(HuffmanTree &,unsigned int*,int ); //生成哈夫曼树void HuffmanCoding(HuffmanTree,HuffmanCode &,int,unsigned int* ); //对哈夫曼树进行编码void PrintHuffmanCode(HuffmanCode,unsigned int*,int,unsigned int*); //显示哈夫曼编码void Select(HuffmanTree,int,int&,int&); //在数组中寻找权值最小的两个结点void drawHT(int,unsigned int* ,unsigned int*);int powlen(int);void ptspace(int );int mstep(int);void main(){HuffmanTree HT; //哈夫曼树HTHuffmanCode HC; //哈夫曼编码表HCint n,i; //n是哈夫曼树叶子结点数unsigned int *w,*num; //w存放叶子结点权值char j='y';printf("演示构造哈夫曼树.\n");printf("输入需要进行编码的字符数目.\n例如:8\n");printf("然后输入每个字符出现的次数/权值.\n");printf("例如:5 29 7 8 14 23 3 11\n");printf("自动构造一棵哈夫曼树并显示哈夫曼编码.\n");printf(" 5---0110\n 29---10\n 7---1110\n 8---1111\n 14---110\n");printf(" 23---00\n 3---0111\n 11---010\n");while(j!='N'&&j!='n'){printf("请输入字符数目:");scanf("%d",&n); //输入字符数目if(n<=1) {printf("该数不合理!\n");continue;}w=(unsigned int*)malloc(2*n*sizeof(unsigned int)); //开辟空间存放权值num=(unsigned int*)malloc(2*n*sizeof(unsigned int));printf("请输入各字符出现的次数/权值:\n");for(i=0;i<n;i++) scanf("%d",&w[i]); //输入各字符出现的次数/权值CreateHuffmanTree(HT,w,n); //生成哈夫曼树HuffmanCoding(HT,HC,n,w); //进行哈夫曼编码PrintHuffmanCode(HC,w,n,num); //显示哈夫曼编码printf("\n");drawHT(n,w,num);printf("哈夫曼树构造完毕,还要继续吗?(Y/N)");free(w);free(num);scanf(" %c",&j);}}void CreateHuffmanTree(HuffmanTree &HT,unsigned int *w,int n){//w存放n个结点的权值,将构造一棵哈夫曼树HTint i,m;int s1,s2;HuffmanTree p;if(n<=1) return;m=2*n-1; //n个叶子结点的哈夫曼树,有2*n-1个结点HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //开辟2*n各结点空间for(p=HT+1,i=1;i<=n;++i,++p,++w) //进行初始化{ p->weight=*w;p->parent=0;p->lchild=0;p->rchild=0;}for(;i<=m;++i,++p){p->weight=0;p->parent=0;p->lchild=0;p->rchild=0;}for(i=n+1;i<=m;++i) //建哈夫曼树{Select(HT,i-1,s1,s2);//从HT[1...i-1]中选择parent为0且weight最小的两个结点,其序号分别为s1和s2HT[s1].parent=i; HT[s2].parent=i; //修改s1和s2结点的父指针parentHT[i].lchild=s1; HT[i].rchild=s2; //修改i结点的左右孩子指针HT[i].weight=HT[s1].weight+HT[s2].weight; //修改权值}}void HuffmanCoding(HuffmanTree HT,HuffmanCode &HC,int n,unsigned int* w) {//将有n个叶子结点的哈夫曼树HT进行编码,所编的码存放在HC中//方法是从叶子到根逆向求每个叶子结点的哈夫曼编码int i,c,f,start;char *cd;HC=(HuffmanCode)malloc((n*2)*sizeof(char *)); //分配n个编码的头指针向量cd=(char *)malloc(n*sizeof(char)); //开辟一个求编码的工作空间cd[n-1]='\0'; //编码结束符for(i=1;i<2*n;++i) //逐个地求哈夫曼编码{start=n-1;//编码结束位置if(i>n)w[i-1]=HT[i].weight;for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent) //从叶子到根逆向求编码{if(HT[f].lchild==c)cd[--start]='0'; //若是左孩子编为'0'elsecd[--start]='1'; //若是右孩子编为'1' }HC[i]=(char *)malloc((n-start)*sizeof(char)); //为第i个编码分配空间strcpy(HC[i],&cd[start]); //将编码从cd复制到HC中}free(cd); //释放工作空间}void PrintHuffmanCode(HuffmanCode HC,unsigned int *w,int n,unsigned int *num) {//显示有n个叶子结点的哈夫曼树的编码表int i,j,temp,len,x,ly=0;float mux=0;j=powlen(n);printf("HuffmanCode is :\n");for(i=1;i<2*n;i++){temp=atoi(HC[i]);len=strlen(HC[i]);if(i<=n){printf(" %3d---",w[i-1]);puts(HC[i]);mux+=len*w[i-1];ly+=w[i-1];}x=(int)pow(2.0,len);num[i-1]=mstep(temp)+x-1;}mux/=ly;printf("\n");printf("压缩比是%f",j/mux);}void Select(HuffmanTree HT,int t,int&s1,int&s2){//在HT[1...t]中选择parent不为0且权值最小的两个结点,其序号分别为s1和s2 int i,m,n;m=n=10000;for(i=1;i<=t;i++){if(HT[i].parent==0&&(HT[i].weight<m||HT[i].weight<n))if(m<n){n=HT[i].weight;s2=i;}else{m=HT[i].weight;s1=i;}}if(s1>s2) //s1放较小的序号{i=s1;s1=s2;s2=i;}}int mstep(int a){int i=1,x=0,mod;if(a==0)return 0;while(a){mod=a%10;if(mod==1){x=x+i;}a=a/10;i=i*2;}return x;}void ptspace(int x){int i=0;for(i=0;i<x;i++)printf(" ");}void drawHT(int n,unsigned int *w,unsigned int*num){int i=0,j=1,k=1,m=2*n-1,xu=1,t=2;int x[500]={0};for(i=0;i<2*n-1;i++){x[num[i]]=w[i];}i=0;do{ptspace(64/t);for(xu=j;(xu<j*2);xu++){if(x[xu-1]!=0){printf("%d",x[xu-1]);i++;}elseprintf(" ");ptspace(2*64/t-1);}t*=2;j*=2;printf("\n");}while(i<2*n-1);}int powlen(int n){int i=2,j=1;float mux=0;while(n>i){i=i*2;j=j+1;}return j;}四.所输入的数据及运行结果1.2.五.实验心得通过此次实验,对于此次实验要求中的程序设计有了一定的认识。
计算方法实验指导书.

计 算 方 法实 验 指 导 书彭彬计算机技术实验中心2012年3月· 实验环境: VC++ 6.0· 实验要求:在机房做实验只是对准备好的实验方案进行验证,因此上机前要检查实验准备情况,通过检查后方可上机。
没有认真准备的学生不能上机,本次实验没有分数。
实验中要注意考察和体会数值计算中出现的一些问题和现象:误差的估计,算法的稳定性、收敛性、收敛速度以及迭代初值对收敛的影响等。
· 关于计算精度:如果没有特别说明,在计算的过程中,小数点后保留5位数字,最后四舍五入到小数点后四位数字。
迭代运算的结束条件统一为51102-⨯。
在VC++ 6.0中,可使用setprecision 在流的输出中控制浮点数的显示(缺省显示6位)。
演示如下: # include<iostream.h> # include<math.h> # include<iomanip.h>//输出6位精度,输出左对齐cout<<setprecision(6)<<setiosflags(ios::left); //设置输出宽度为12(不够将补充0) cout<<setw(12)<<coeff[i];· 关于图形绘制本课程个别实验要求画出函数的曲线,所有画图题目均要求用MFC 完成。
利用VC++6.0的MFC 画图,先要建立一个工程,然后在***View 中加入自定义变量、自定义函数等,最后在OnDraw ()方法中调用自定义函数。
也可以把代码直接写入OnDraw ()方法中。
画曲线有两种方法,(一)一句坐标逐个打点(用SetPixel()函数),(二)先把当前光标移动(MoveTo()函数)到曲线的始点,再用LineTo ()函数画线。
线的样式由画笔决定。
对封闭区域可以填充,填充的样式由画刷决定。
在VC++6.0中,先新建一个MFC AppWizard(exe)类型的工程(建立工程时,“应用程序类型”选择“单文档”;“是否包含数据库”选择“不包含数据库”;其它选择缺省),然后在“ClassView ”中选择XXView 类文件加以操作。
C语言程序设计实验六函数答案《西北民大电气学院》

实验六函数一,实验目的:1,掌握定义函数的方法.2,掌握函数实参与形参的对应关系,以及"值传递"的方式.3,掌握函数的嵌套调用和递归调用的方法.4,掌握全局变量和局部变量动态变量,静态变量的概念和使用方法.二,实验准备:1,复习函数调用的基本理论知识.2,复习函数的嵌套调用和递归调用的方法.3,复习全局变量,局部变量;静态变量,动态变量;外部变量等概念和具体使用. 4,源程序.三,实验步骤及内容:1,运行程序并回答问题(1)程序main(){ play(3);}void print_star(){ printf("* * * * * * * * * *\n")}void print_message(){ printf("Good Friend! \n");}void play(n)int n;{ int i;for(i=1;i<=n;++i){ print_star();print_message();}}问题:运行后出现什么错误为什么应如何修改请上机调试.修改:main(){ play(3);}void print_star(){ printf("* * * * * * * * * *\n");(缺少分号)}void print_message(){ printf("Good Friend! \n");}play(n)(原先void的与声明类型不同)int n;{ int i;for(i=1;i<=n;++i){ print_star();print_message();}getch();}运行结果(2)以下程序用于计算1+2+3+4+5.main(){ int i,sum;for(i=1;i<=5;++i)sum=add(i);printf("sum=%d\n",sum);getch();}add (a)int a;{static int s=0;s=s+a;return(s);}运行结果:问题:此程序能否得到正确结果为什么请在不增加语句的条件下,修改程序并上机调试.(3)程序int x=567,y=890;main(){ printf("x=%d,y=%d\n",x,y);}运行结果:问题:运行程序后出现什么错误为什么如何修改答:定义位置出错,y的定义在主函数之后了,将y的定义改在和x一样的位置处。
《C语言程序设计》实验报告(实验1-11) 2013.3

《C语言程序设计》实验报告2012~2013学年第二学期班级姓名学号指导教师实验一实验项目名称:C程序的运行环境和运行C程序的方法所使用的工具软件及环境:Visual C++ 6.0一、实验目的:1.了解在Visual C++ 6.0环境下如何编辑、编译、连接和运行一个C程序;2.通过运行简单的C程序,初步了解C源程序的特点。
二、预习内容:教材《C语言程序设计教程》第1章。
三、实验内容:1. 在Visual C++ 6.0环境下输入并运行下面的程序:#include <stdio.h>int main( ){printf("This is a C program.\n");return 0;}2. 在Visual C++ 6.0环境下输入下面的程序(有语法错误),编译、连接、调试该程序,直至程序无语法错误,然后运行程序,并观察分析运行结果。
#include <stdio.h>int main( ){int a,b,suma=3;b=4;sun=a+b;print(“%d+%d=%d\n”,a,b,sum);return 0;}四、实验结果:1. 运行结果(或截图):2. (1) 改正后的源程序:(2) 运行结果(或截图):五、思考题:1. 一个C程序上机的步骤有哪些?答:2. 组成C程序的基本单位是函数,一个函数包括哪几个部分?答:成绩指导教师签名实验二实验项目名称:数据类型、运算符和表达式所使用的工具软件及环境:Visual C++ 6.0一、实验目的:1.掌握整型、实型与字符型这三种基本类型的概念;2.掌握常量及变量的使用方法;3. 掌握基本算术运算符及其表达式的使用方法;4. 掌握++、--运算符、赋值运算符及其表达式的使用方法。
二、预习内容:教材《C语言程序设计教程》第2章。
三、实验内容:1. 在Visual C++ 6.0环境下输入下面的程序,编译、连接、调试该程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算方法实验报告实验一 舍入误差与数值稳定性目的与要求: 1、 通过上机编程,复习巩固以前所学程序设计语言; 2、 通过上机计算,了解舍入误差所引起的数值不稳定性。
3、 通过上机计算,了解运算次序对计算结果的影响,从而尽量避免大数吃小数的现象。
实验内容:● 通过正反两个实例的计算,了解利用计算机进行数值计算中舍入误差所引起的数值不稳定性,深入理解初始小的舍入误差可能造成误差积累从而对计算结果的巨大影响。
● 通过实际编程,了解运算次序对计算结果的影响,了解实数运算符合的结合律和分配律在计算机里不一定成立。
●1 对 n = 0,1,2,…,20 计算定积分yn= dx 5x 1nx⎰+算法 1 利用递推公式yn = n1- 5y1n - n = 1,2,…,20取=+=⎰dx 5x 11yln6- ln5 ≈ 0.182 322 算法 2 利用递推公式515n 1y 1n -=-ynn = 20,19,…,1注意到1051dx 51dx 5x dx 61126112010201020x x x =≤+≤=⎰⎰⎰ 取730 008.0)12611051(201y20≈+≈算法一:#include<stdio.h> #include<conio.h> #include<math.h> #include"stdlib.h" void main(void) {float y_0=log(6.0)-log(5.0),y_1; int n=1;system("cls");/*清屏*/ printf("y[0]=%-20f",y_0); while(1) {y_1=1.0/n-5*y_0;printf("y[%d]=%-20f",n,y_1);/*输出*/ if(n>=20)break; y_0=y_1; n++;if(n%3==0)printf("\n"); }getch();/*保持用户屏幕*/ }算法二:#include<stdio.h> #include<conio.h> #include<math.h> #include"stdlib.h"main(){float y_0=(1/105.0+1/126.0)/2,y_1;int n=20;system("cls");/*清屏*/printf("y[20]=%-20f",y_0);while(1){y_1=1/(5.0*n)-y_0/5.0;printf("y[%d]=%-20f",n-1,y_1);if(n<=1)break;y_0=y_1;n--;if(n%3==0)printf("\n");}getch();}说明:从计算结果可以看出,算法1是不稳定的,而算法2是稳定的。
计算方法实验报告实验二 拉格朗日插值与牛顿插值一、目的与要求:熟悉拉格朗日插值多项式和牛顿插值多项式,注意其不同特点; 二、 实验内容:通过拉格朗日插值和牛顿插值多项式的两个实例的计算,了解两种求解方法,分析他们的优缺点。
三、 程序与实例 算法1.输入x i ,y i (i=0,1,2,⋯,n),令L(x n )=0; 2. 对=0,1,2,⋯,n 计算 ll i (x)=∏≠=--nij i jijx xx x 0L n ← L n +l i (x)y i程序与实例例1 已知函数表用三次拉格朗日多项式求x=0.5635的函数近似值。
拉格朗日插值: #include <stdio.h> #include <conio.h> #include <malloc.h> #include"stdlib.h"float Lagrange(float *x,float *y,float xx,int n) {int i,j;float *a,yy=0.0;a=(float *) malloc(n*sizeof(float));for (i=0;i<=n-1;i++){a[i]=y[i];for (j=0;j<=n-1;j++)if (j!=i) a[i]*=(xx-x[j])/(x[i]-x[j]);yy+=a[i];}free(a);return yy;}void main(){float x[4]={0.56160,0.56280,0.56401,0.56521}; float y[4]={0.82741,0.82659,0.82577,0.82495}; float xx=0.5635,yy;float Lagrange(float *,float *,float,int);yy=Lagrange(x,y,xx,4);system("cls");/*清屏*/printf("x=%f, y=%f\n",xx,yy);getch();}运行结果:X=0.563500,y=0.826116牛顿插值多项式算法1.输入n,xi ,yi(i=0,1,2⋯,n);2.对k=1,2,3⋯,n, i=1,2, ⋯,k计算各阶差商f(x0,x1⋯,xk);3.计算函数值Nn (x)=f(x)+f[x, x1](x- x)+⋯+f[x, x1,⋯,xn](x- x)(x- x1)⋯(x-x1-n)程序与实例例2已知函数表用牛顿插值多项式求Nn (0.596)和Nn(0.895)。
牛顿插值多项式:#include <stdio.h>#include <conio.h>#include <malloc.h>#include"stdlib.h"#define N 4void Difference(float *x,float *y,int n){float *f;int k,i;f=(float*)malloc(n*sizeof(float));for (k=1;k<=n;k++){f[0]=y[k];for (i=0;i<k;i++)f[i+1]=(f[i]-y[i])/(x[k]-x[i]);y[k]=f[k];}return;}main(){int i;float varx=0.596,b;float x[N+1]={0.4,0.55,0.65,0.8,0.9};float y[N+1]={0.41075,0.57815,0.69675,0.88811,1.02652}; Difference(x,(float*)y,N);system("cls");/*清屏*/b=y[N];for (i=N-1;i>=0;i--) b=b*(varx-x[i])+y[i];printf("NInterp(%f)=%f",varx,b);getch();}运行结果:NInterp<0.596000>=0.631918实验三 复化辛卜生法,龙贝格法一、 目的与要求:通过实际计算体会各种方法的精确度;会编写用复化辛卜生、龙贝格算法求定积分的程序。
二、 实验内容:通过实际计算体会各种方法的精确度并且会编写用复化辛卜生、龙贝格算法求定积分的程序三、 程序与实例 复化辛卜生公式算法:复化辛卜生公式为S n =h/6∑∑+-=+++)]()2/(4)([110k k kn k x f h x f xf ,计算过程为:1.令,/)(n a b h -= ),2/(1h a f s += ;02=s 2.对1,,2,1-=n k 计算),2/(11h kh a f s s +++= )(22kh a f s s ++= 3.))(24)((6/21b f s s a f h s +++= 。
程序与实例例 用复化辛卜生法计算积分 dx x I ⎰+=102)1/(1#include <conio.h> /* 此头函数请不要删除 */ #include <stdio.h> float N,A=0,B=1,X; float F(float x);float Si() //复化辛普生公式 {float i,n,h,t,s1,s2=0; n=N; h=(B-A)/n; s1=F(A+h/2);for(i=1;i <n;i=i+1) {X=A+i*h+h/2; s1=F(X)+s1; }for(i=1;i<n;i=i+1) {X=A+i*h; s2=F(X)+s2; }t=h*(F(A)+4*s1+2*s2+F(B))/6; return(t); }float F(float x) //被积分函数f(x) {float f; f=1/(1+x*x); return(f); }double main() //主函数 {float z;printf("\n 输入n 的值:\n "); scanf( "%f",&N); {z=Si();printf( "利用复化辛普生公式计算 "); }printf( "结果为:%f \n",z);getch(); /* 此语句请不要删除*/ }运行结果: S(2)=0.785392 S(4)=0.785398S(5)=0.785398计算方法实验报告实验四 常微分方程的数值解法目的与要求:熟悉求解常微分方程初值问题的有关方法和理论,主要是改进欧拉法 会编制上述方法的计算程序针对实习题编制程序,并上机计算其所需要的结果; 二、 实验内容:熟悉求解常微分方程初值问题的有关方法和理论,主要是改进欧拉法,体会其解法的功能。
程序与实例 改进欧拉方法 算法概要解一阶常微分方程初值问题⎩⎨⎧=='00)(),(y x y y x f y b x a ≤≤将区间[a,b]作n 等分,取步长nab h -=。
欧拉公式为),(1i i i i y x hf y y +=+ 梯形公式为[]),(),(2111+++++=i i i i i i y x f y x f hy y 改进欧拉法,采用公式()()[]⎪⎩⎪⎨⎧++=+=++++1111,,2),(i i i i i i i i i i y x f y x f hy y y x hf y y 或表为⎪⎪⎪⎩⎪⎪⎪⎨⎧+=+=+=++)(21),(),(11c p i p i i c i i i p y y y y x hf y y y x hf y y 实验:30≤≤x实验程序:#include <stdio.h> void main(void) {float x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,y0,y1,y2,y3,y4,y5,y6,y7,y8,y9,h;x0=0.3,x1=0.6,x2=0.9,x3=1.2,x4=1.5,x5=1.8,x6=2.1,x7=2.4,x8=2.7,x9=3.0,y0=2.0,h=0.3;y1=y0+h*(y0-(2*x0)/y0);y2=y1+h*(y1-(2*x1)/y1);y3=y2+h*(y2-(2*x2)/y2);y4=y3+h*(y3-(2*x3)/y3);()⎩⎨⎧=-='202y xy yy5=y4+h*(y4-(2*x4)/y4);y6=y5+h*(y5-(2*x5)/y5);y7=y6+h*(y6-(2*x6)/y6);y8=y7+h*(y7-(2*x7)/y7);y9=y8+h*(y8-(2*x8)/y8);printf("%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n",y1,y2,y3,y4,y5,y6,y7,y8 ,y9);}实验结果:实验五方程求根一、目的与要求:通过对二分法和牛顿迭代法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点;比较二者的计算速度和计算精度。