1、数值计算基础目录实验一 直接法解线性方程组的 .1实验二 插值方法 .4实验三 数值积分 .6实验四 常微分方程的数值解 .8实验五 迭代法解线性方程组与非线性方程 10实验一 直接法解线性方程组一、实验目的掌握全选主元消去法与高斯-塞德尔法解线性方程组。二、实验内容分别写出 Guass 列选主元消去法与追赶法的算法,编写程序上机调试出结果,要求所编程序适用于任何一解线性方程组问题,即能解决这一类问题,而不是某一个问题。实验中以下列数据验证程序的正确性。1、用 Guass 列选主元消去法求解方程组 5.83747.856935122x2、用追赶法求解方程组 0102101005432x三、实验
2、仪器设备与材料主流微型计算机四、实验原理1、Guass 列选主元消去法对于 AX =B 1) 、消元过程:将 ( A|B) 进行变换为 ,其中 是上三角矩阵。即:)|(BA nnnnn babaa 01212212112k 从 1 到 n-1a、 列选主元选取第 k 列中绝对值最大元素 作为主元。iknmaxb、 换行ikjjbnka,1,c、 归一化kkjja/,d、 消元nkibnkjkii jjj ,1, ,1; 2) 、回代过程:由 解出 。)|(BA1x,2,/1nkxabnkjj2、追赶法线性方程组为: nnnfffxxabccab 13211321133221 做 LU 分解为:
3、 11,2321 nnRL 分解公式:)1,2( ),32(,),3(1nicnibiaii iiii 则 yUxfLfxfAx回代公式:),32(11 niyffii )1,(1ixyiiin五、实验步骤1、理解并掌握全选主元消去法与高斯-塞德尔迭代法公式;2、画出全选主元消去法与高斯-塞德尔迭代法的流程图3、使用 C 语言编写出相应的程序并调试验证通过六、实验报告要求1、统一使用武汉科技大学实验报告本书写,实验报告的内容要求有:实验目的、实验内容、程序流程图、源程序、运行结果及实验小结六个部分。2、源程序需打印后粘贴在实验报告册内;3、运行结果以屏幕截图形式保存并打印后粘贴在实验报告册内。
4、七、实验注意事项注意如何定义数据结构以保存矩阵和解以降低算法的复杂性。八、思考题若使用全主元消去法,在编程中应如何记录保存对于未知数的调换。实验二 插值方法一、实验目的掌握拉格郎日插值法与牛顿插值法构造插值多项式。二、实验内容分别写出拉格郎日插值法与牛顿插值法的算法,编写程序上机调试出结果,要求所编程序适用于任何一组插值节点,即能解决这一类问题,而不是某一个问题。实验中以下列数据验证程序的正确性。已知下列函数表xi 0.56160 0.56280 0.56401 0.56521yi 0.82741 0.82659 0.82577 0.82495求 x=0.5635时的函数值。三、实验仪器设备与
5、材料主流微型计算机四、实验原理已知 n 个插值节点的函数值,则可由拉格郎日插值公式与牛顿插值公式构造出插值多项式,从而由该插值多项式求出所要求点的函数值。拉格郎日插值公式与牛顿插值公式如下:1、Lagrange 插值公式 )()(.)()( 010 xlyxlyxllxLnknn nkjjkkkkk nk xl 01110 )()()() 2、Newton 插值公式 )()(, (,)()( 11010 102 nnn xxxffxN五、实验步骤1、理解并掌握拉格郎日插值法与牛顿插值法的公式;2、画出拉格郎日插值法与牛顿插值法算法的流程图;3、使用 C 语言编写出相应的程序并调试验证通过。六、
6、实验报告要求1、统一使用武汉科技大学实验报告本书写,实验报告的内容要求有:实验目的、实验内容、程序流程图、源程序、运行结果及实验小结六个部分。2、源程序需打印后粘贴在实验报告册内;3、运行结果以屏幕截图形式保存并打印后粘贴在实验报告册内。七、实验注意事项Newton 插值法在编程时应注意定义何种数据结构以保存差商。八、思考题比较 Lagrange 插值法与 Newton 插值法的异同。实验三 数值积分一、实验目的掌握复化梯形法与龙贝格法计算定积分。二、实验内容分别写出变步长梯形法与 Romberge 法计算定积分的算法,编写程序上机调试出结果,要求所编程序适用于任何类型的定积分,即能解决这一类
7、问题,而不是某一个问题。实验中以下列数据验证程序的正确性。求 。01.,sin10dx三、实验仪器设备与材料主流微型计算机四、实验原理通过变步长梯形法与龙贝格法,我们只要知道已知 n 个求积节点的函数值,则可由相应的公式求出该函数的积分值,从而不需要求该函数的原函数。变步长梯形法与龙贝格法公式如下: 1、变步长梯形法 10 )(2)(niini ii bfxfafhT102/2 )(niinfT用 来控制精度n22、龙贝格法 102/)(niinxfhTnnS342SC156nnnR2用 来控制精度nR2五、实验步骤1、理解并掌握变步长梯形法与龙贝格法的公式;2、画出变步长梯形法与龙贝格法的流
8、程图3、使用 C 语言编写出相应的程序并调试验证通过六、实验报告要求1、统一使用武汉科技大学实验报告本书写,实验报告的内容要求有:实验目的、实验内容、程序流程图、源程序、运行结果及实验小结六个部分。2、源程序需打印后粘贴在实验报告册内;3、运行结果以屏幕截图形式保存并打印后粘贴在实验报告册内。七、实验注意事项在 积分中,被积函数在 x=0 点函数值为 1,对该点在程序设计中应注意对10sindx其的定义。八、思考题使用复化梯形法与复化 Simpson 法来计算该问题有何缺点?实验四 常微分方程的数值解一、实验目的掌握改进欧拉法与四阶龙格-库塔求解一阶常微分方程的初值问题。二、实验内容分别写出改
9、进欧拉法与四阶龙格-库塔求解的算法,编写程序上机调试出结果,要求所编程序适用于任何一阶常微分方程的数值解问题,即能解决这一类问题,而不是某一个问题。实验中以下列数据验证程序的正确性。求 步长 h=0.25。 )50(2)(xyx三、实验仪器设备与材料主流微型计算机四、实验原理常微分方程的数值解主要采用“步进式” ,即求解过程顺着节点排列次序一步一步向前推进,在单步法中改进欧拉法和四阶龙格-库塔法公式如下: 1、改进欧拉法 ),(nnyxhfy),(211 nyxf2、四阶龙格-库塔法 ),(2),()2(6343121 431hkyxfkhfyxkkknnnn五、实验步骤1、理解并掌握改进欧拉
10、法与四阶龙格-库塔法的公式;2、画出改进欧拉法与四阶龙格-库塔法的流程图3、使用 C 语言编写出相应的程序并调试验证通过六、实验报告要求1、统一使用武汉科技大学实验报告本书写,实验报告的内容要求有:实验目的、实验内容、程序流程图、源程序、运行结果及实验小结六个部分。2、源程序需打印后粘贴在实验报告册内;3、运行结果以屏幕截图形式保存并打印后粘贴在实验报告册内。七、实验注意事项的精确解为 ,通过调整步长,观察结果的 )50(2)(xyx )1/(22xy精度的变化八、思考题如何对四阶龙格-库塔法进行改进,以保证结果的精度。实验五 迭代法解线性方程组与非线性方程一、实验目的掌握高斯-塞德尔迭代法求
11、解线性方程组与牛顿迭代法求方程根。二、实验内容分别写出高斯-塞德尔迭代法与牛顿迭代法的算法,编写程序上机调试出结果,要求所编程序适用于任何一个方程的求根,即能解决这一类问题,而不是某一个问题。实验中以下列数据验证程序的正确性。1、高斯-塞德尔迭代法求解线性方程组 0174132159742x2、用牛顿迭代法求方程 的近似根, ,牛顿法的初始值为01.1。三、实验仪器设备与材料主流微型计算机四、实验原理二分法通过将含根区间逐步二分,从而将根的区间缩小到容许误差范围。牛顿通过迭代的方法逐步趋进于精确解,该两种方法的公式如下: 1、高斯-塞德尔迭代法1)判断线性方程组是否主对角占优 nianijj
12、,21,12)直接分离 xi,即 niaxbdxnjjiii ,21,/)(1建立高斯-塞德尔迭代格式为: niaxxxnijkjijkjki ,21,/)(1(1)()1( 3)取初值迭代求解至所要求的精度为止。2、牛顿法)(1kkxfx五、实验步骤1、理解并掌握二分法与牛顿法的公式;2、画出二分法与牛顿法的流程图3、使用 C 语言编写出相应的程序并调试验证通过六、实验报告要求1、统一使用武汉科技大学实验报告本书写,实验报告的内容要求有:实验目的、实验内容、程序流程图、源程序、运行结果及实验小结六个部分。2、源程序需打印后粘贴在实验报告册内;3、运行结果以屏幕截图形式保存并打印后粘贴在实验报
13、告册内。七、实验注意事项对于二分法应注意二分后如何判断根的区间,对于牛顿法注意如何确定迭代过程的结束八、思考题若使用牛顿法是发散的,如何对牛顿法进行改进以保证其收敛性。前三个实验的程序代码(C/C+)和运行结果截图Gauss 全选主元解方程组的源程序及运行结果#include #include #include using namespace std;class Matrixpublic:Matrix();Matrix();void SetMatrix(const int n,const double esp1);/构造线性方程组相应的矩阵,n 为方程的未知数数目,esp1 为要求的精度voi
14、d Max(const int r);/全选主元void ChangeRC(const int r);/根据主元变换矩阵的行或列void Eliminate(const int r);/处理消元工作void Result()const;/计算方程的解void Calculate();int GetRank()const;/返回矩阵的行数double GetX(const i)const;/确定方程组的第 i 个解(1n;if(nesp1;if(esp1*(a+i*N+j);cin*(b+i);/flag 中存储的值对应相应的 x 值,当方程的解由于列变换交换后,flag 中/的值也相应交换,最
15、后用于恢复解的顺序for( i=0;i=0;-i)temp=0;for(int j=i+1;j*(flag+j+1)int temp1;/交换解的顺序temp=*(b+j);*(b+j)=*(b+j+1);*(b+j+1)=temp;/交换用于标记的元素的顺序temp1=*(flag+j);*(flag+j)=*(flag+j+1);*(flag+j+1)=temp1;void Matrix:Calculate() /根据矩阵行数重复进行寻找最大主元、变换行或列、消元for(int i=0;i#includeusing namespace std;class MatrixThrpublic:M
16、atrixThr();MatrixThr();void SetMatrixThr(const int n);/设置三对角矩阵的数据void Result();/计算三对角矩阵的解double GetX(const int i)const;/取得第 i 个解,i 从 1 开始int GetN() const;/返回未知数的数目private:int N;/N 为未知数的数目/b 为矩阵主对角线的元素首地址,a 为主对角线左边一斜条元素的首地址,/c 为主对角线右边一斜条元素首地址,f 为方程组的常数首地址double *a,*b,*c,*f;int main()MatrixThr matrix;
17、int n;docoutn;while(n*b*c*f;for(int i=1;i*(a+i-1)*(b+i)*(c+i)*(f+i);cin*(a+i-1)*(b+i)*(f+i);void MatrixThr:Result() /对系数矩阵 A 作 Crout 分解for(int i=0;i=0;-i) *(a+i)=*(b+i)-(*(c+i)*(*(a+i+1);int MatrixThr:GetN()constreturn N;double MatrixThr:GetX(const int i)constreturn *(a+i-1);运行结果Lagrange 插值法的源程序:#in
18、clude#includeusing namespace std;class Lagrangepublic:Lagrange();Lagrange();void SetLagrange(const int n);/根据用户的输入设置 Lagrange 类中的插值点数据bool Exist(const double x,const int i);/检测是否输入了与前 i 个插值结点横坐标相同的点int GetN()const;/获取插值结点的数目void Calculate(const double a);/计算横坐标 a 对应的函数值double GetResult()const;/返回计算的
19、函数值private:int N;/插值结点的数目double *x,*y,zx,zy;/x、y 分别用于存储插值点的数据,zx、zy 表示所求的坐标点;int main()int n=2;Lagrange L;doif(n2“n;while(na;L.Calculate(a);cout*(x+i)*(y+i);/如果不是输入第一个坐标值,则会对输入的横坐标进行合法性检测while(i!=0void Lagrange:Calculate(const double a)zx=a;for(int i=0;iusing namespace std;class Matrixpublic:Matrix(
20、);Matrix();void SetMatrix(const int n);/根据用户输入的插值点的数据设置计算结果的矩阵int GetN()const;/返回插值点的数目void Calculate();/计算差商double GetResult(double x)const;/根据输入的横坐标求函数值,返回运算结果private:double *a,*f;/a 和 f 分别用于存储插值点的横坐标和相应的函数值int N;/记录插值点的数目;int main()Matrix matrix;int n;docoutn;while(nx;cout*(a+i)*(f+i);int Matrix:
21、GetN() constreturn N;void Matrix:Calculate() /将差商存储在一个一维数组内for(int i=0;ii;-j)*(f+j)=(*(f+j)-*(f+j-1)/(*(a+j)-*(a+j-i-1);double Matrix:GetResult(double x) const /利用差商和插值点的横坐标及第一个插值点的纵坐标计算函数值double result=*f;/指针 f 指向第一个插值点的纵坐标for(int i=1;i#includeusing namespace std;double function(const double x);/求被
22、积函数的值并返回/accumulate()为求定积分的函数,a、b 分别为积分的上下限 ,默认精度为 0.00001double accumulate(const double a,const double b,const double eps=0.00001);int main()double a,b,eps;/a,b 分别为定积分的上限和下限,h 为步长,eps 为要求的精度a=0;b=1;eps=0.00001;couteps)n*=2;h/=2;/步长折半T1=T2;/利用 T1 计算 T2double temp=0;for(int i=1;i#include using namesp
23、ace std;/求被积函数的值并返回double fun(const double x);/Romberge()为求定积分的函数, a、b 分别为积分的上下限,默认精度为 0.00001double Romberg(const double a,const double b,const double eps=0.0001);/函数 Tm()为 T-数表的计算公式double Tm(const double T1,const double T2,const int m);int main()double a,b,eps;/a,b 分别为定积分的上限和下限,h 为步长,eps 为要求的精度a=0;b=1;eps=0.00001;couteps)/比较 T-数表第(l+1)行和第 i 行的最后一个数据的差值 /将 T-数表第 l+1 行的最后两个个数据存入数组Tl-1=T1;Tl=T2;+l;flag=1;/表示没有求得符合精度的值while(flag);return T2;/返回符合精度的解