东南大学数值分析上机题答案

合集下载

C++上机考试题,上机练习,东南大学C++上机实验

C++上机考试题,上机练习,东南大学C++上机实验

定义一个复数类,通过重载运算符:=、+=、-=、+、-、*、/、= =、!=,直接实现两个复数之间的各种运算。

编写一个完整的程序(包括测试各运算符的程序部分)。

*/#include "stdio.h"//标准输入输出头文件#include "iostream.h"class Complex{float Real,Image;public:Complex(float r=0,float i=0){Real=r;Image=i;};float GetR(){return Real;}float GetI(){return Image;}//后面主函数要直接调用私有成员数据void show(){cout<<"Real="<<Real<<'\t'<<"Image="<<Image<<endl;}Complex operator +(Complex &);//把形参定义为引用,调用时更方便void operator +=(Complex &);//自加运算,返回值为voidComplex operator -(Complex &);void operator -=(Complex &);Complex operator *(Complex &);Complex operator /(Complex &);void operator =(Complex &);int operator !=(Complex &);int operator ==(Complex &);//返回真假};Complex Complex::operator +(Complex &c)//此时的函数名变为Complex::operator{Complex t;//在函数体内可以定义新的类,并把这个临时的类返回,同样用打点来访问t.Real=Real+c.Real;t.Image=Image+c.Image;return t;}void Complex::operator +=(Complex &c){Real=Real+c.Real;Image=Image+c.Image;}Complex Complex::operator -(Complex &c) {Complex t;t.Real=Real-c.Real;t.Image=Image-c.Image;return t;}void Complex::operator -=(Complex &c){Real=Real-c.Real;Image=Image-c.Image;}Complex Complex::operator *(Complex &c) {Complex t;t.Real=Real*c.Real-Image*c.Image;t.Image=Real*c.Image+Image*c.Real;return t;}Complex Complex::operator /(Complex &c) {Complex t;t.Real=Real*c.Real+Image*c.Image;t.Image=-Real*c.Image-Image*c.Real;float val=c.Real*c.Real+c.Image*c.Image;t.Real=t.Real/val;t.Image=t.Image/val;return t;}void Complex::operator =(Complex &c){Real=c.Real;Image=c.Image;}int Complex::operator !=(Complex &c){int res;//函数体内定义临时变量res=(c.Real!=Real)&&(c.Image!=Image);return res;}int Complex::operator ==(Complex &c){int res;res=(c.Real==Real)&&(c.Image==Image);return res;}void main(){Complex a(3,4),b(6,8),c,d;c=a;//赋值=c.show();d=a+b;//+d.show();c=b-a;//-c.show();c=b;c+=a;//+=c.show();d=b;d-=a;//-=d.show();//c=a;d=a;cout<<endl<<"输出c和d: \n";if(c==d) {c.show();d.show();cout<<"c==d";}c=b;d=a;cout<<endl<<"输出c和d: \n";if(c!=d) {c.show();d.show();cout<<"c!=d";}//cout<<endl;cout<<"a*b: ";c=a*b;c.show();cout<<"\na/b: ";d=b/a;d.show();}//在函数体内可以定义新的类,并把这个临时的类返回,同样用打点来访问/*四、下标运算符[ ]通常用于取数组中某个元素,可以实现数组下标越界的检测等。

东南大学数值分析上机报告完整版

东南大学数值分析上机报告完整版

数值分析上机实验报告目录1.chapter1舍入误差及有效数 (1)2.chapter2Newton迭代法 (3)3.chapter3线性代数方程组数值解法-列主元Gauss消去法 (7)4.chapter3线性代数方程组数值解法-逐次超松弛迭代法 (8)5.chapter4多项式插值与函数最佳逼近 (10)1.chapter1舍入误差及有效数1.1题目设S N =∑1j 2−1N j=2,其精确值为)11123(21+--N N 。

(1)编制按从大到小的顺序11131121222-+⋯⋯+-+-=N S N ,计算S N 的通用程序。

(2)编制按从小到大的顺序1211)1(111222-+⋯⋯+--+-=N N S N ,计算S N 的通用程序。

(3)按两种顺序分别计算64210,10,10S S S ,并指出有效位数。

(编制程序时用单精度)(4)通过本次上机题,你明白了什么? 1.2编写相应的matlab 程序 clear;N=input('please input N:'); AValue=((3/2-1/N-1/(N+1))/2); sn1=single(0); sn2=single(0); for i=2:Nsn1=sn1+1/(i*i-1); %从大到小相加的通用程序% endep1=abs(sn1-AValue); for j=N:-1:2sn2=sn2+1/(j*j-1); %从小到大相加的通用程序% endep2=abs(sn2-AValue);fprintf('精确值为:%f\n',AValue);fprintf('从大到小的顺序累加得sn=%f\n',sn1); fprintf('从大到小相加的误差ep1=%f\n',ep1); fprintf('从小到大的顺序累加得sn=%f\n',sn2); fprintf('从小到大相加的误差ep2=%f\n',ep2); disp('================================='); 1.3matlab 运行程序结果 >> chaper1please input N:100 精确值为:0.740050从大到小的顺序累加得sn=0.740049 从大到小相加的误差ep1=0.000001 从小到大的顺序累加得sn=0.740050 从小到大相加的误差ep2=0.000000 >> chaper1please input N:10000 精确值为:0.749900从大到小的顺序累加得sn=0.749852 从大到小相加的误差ep1=0.000048 从小到大的顺序累加得sn=0.749900 从小到大相加的误差ep2=0.000000please input N:1000000精确值为:0.749999从大到小的顺序累加得sn=0.749852 从大到小相加的误差ep1=0.000147 从小到大的顺序累加得sn=0.749999 从小到大相加的误差ep2=0.0000001.4结果分析以及感悟按照从大到小顺序相加的有效位数为:5,4,3。

东南大学_数值分析_第七章_偏微分方程数值解法

东南大学_数值分析_第七章_偏微分方程数值解法

第七章 偏微分方程数值解法——Crank-Nicolson 格式****(学号) *****(姓名)上机题目要求见教材P346,10题。

一、算法原理本文研究下列定解问题(抛物型方程)22(,) (0,0)(,0)() (0)(0,)(), (1,)() (0)u ua f x t x l t T t x u x x x l u t t u t t t T ϕαβ⎧∂∂-=<<≤≤⎪∂∂⎪=≤≤⎨⎪==<≤⎪⎩(1)的有限差分法,其中a 为正常数,,,,f ϕαβ为已知函数,且满足边界条件和初始条件。

关于式(1)的求解,采用离散化方法,剖分网格,构造差分格式。

其中,网格剖分是将区域{}0,0D x l t T =≤≤≤≤用两簇平行直线(0)(0)i k x x ih i M t t k k N τ==≤≤⎧⎨==≤≤⎩ 分割成矩形网格,其中,l Th M Nτ==分别为空间步长和时间步长。

将式(1)中的偏导数使用不同的差商代替,将得到不同的差分格式,如古典显格式、古典隐格式、Crank-Nicolson 格式等。

其中,Crank-Nicolson 格式具有更高的收敛阶数,应用更广泛,故本文采用Crank-Nicolson 格式求解抛物型方程。

Crank-Nicolson 格式推导:在节点(,)2i k x t τ+处考虑式(1),有22(,)(,)(,)222i k i k i k u u x t a x t f x t t x τττ∂∂+-+=+∂∂ (2)对偏导数(,)2i k u x t t τ∂+∂用中心差分展开 []2311+131(,)(,)(,)(,) ()224k k i k i k i k i i k i k u ux t u x t u x t x t t t t ττηητ++∂∂+=--<<∂∂ (3) 将22(,)2i k u x t x τ∂+∂在节点(,)i k x t 和1(,)i k x t +表示为222+122224+1221(,)=(,)+(,)22 (,) ()8i k i k i k k k i i k i k u u ux t x t x t x x x ux t t x tττηη⎡⎤∂∂∂+⎢⎥∂∂∂⎣⎦∂-<<∂∂ (4)对以上两个偏导数用二阶差分展开[]2112224i+141(,)(,)2(,)(,) (,) ()12i k i k i k i k kk i k i i u x t u x t u x t u x t x hh u t x x x ξξ+-∂=-+∂∂-<<∂ (5)[]211111122241i+141(,)(,)2(,)(,) (,) ()12i k i k i k i k k ki k i i u x t u x t u x t u x t x hh u t x x xξξ++++-++∂=-+∂∂-<<∂ (6)将式(4)(5)(6)分别代入式(3),略去高阶小量,用k i u 代替(,)i k u x t 并化简得()()()2111111112122,22k k k k k k k k i i i i i i i i i k a u u u u u u u u f x t h ττ+++++-+-⎛⎫⎡⎤---++-+=+ ⎪⎣⎦⎝⎭ (7) 令2/r a h τ=,将式(7)联合式(1)初始条件和边界条件,用矩阵的形式表示为:11112212211111221122221122221122 k k k k k kM M k k M M r r r r u u r r r r r ru u r r r r u u r r u u r r r r +++--+--⎡⎤⎡⎤+---⎢⎥⎢⎥⎢⎥⎢⎥⎡⎤⎡⎤⎢⎥⎢⎥-+--⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥-+--⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎢⎥⎢⎥⎢⎥⎢⎥-+-⎢⎥⎢⎥⎣⎦⎣⎦()()()()()()112211,22,2 ,2,22k k k k M k M k k k r f x t t t f x t f x t r f x t t t ττααττττττββ+--+⎡⎤⎛⎫+++ ⎪⎢⎥⎝⎭⎢⎥⎢⎥⎛⎫+ ⎪⎢⎥⎝⎭⎢⎥+⎢⎥⎢⎥⎛⎫⎢⎥+ ⎪⎢⎥⎝⎭⎢⎥⎛⎫⎢⎥+++ ⎪⎢⎥⎝⎭⎣⎦(8) Crank-Nicolson 格式的截断误差为22()R O h τ=+,具有较高的精度。

数值分析上机实习题及答案.docx

数值分析上机实习题及答案.docx

方詡文金兴:爭[数值分析]2017-2018第二学期上机实习题1:编程计算亍丄,其中C= 4. 4942x10307,给出并观察计算结心C"果,若有问题,分析之。

解:mat lab 编程如下:E) funct ion diy i ti formatlong g;n 二input C 输入ii 值= c= 4.4942E307; sum 二0; s 二 0;E3 for i = l:n s = l/ (c*i);>> diyiti 输入n 值:10 104.6356e-308 >> diyiti输入ri 值:1001004.6356e-308 >> diyiti 输入n 值:1000 10004.6356e-308 >> diyiti揄入n 值* 1000001000004・ 6356e-308 >> diyiti输入n 值;1000000001000000004.6356e-308图二:运行结果Mat lab 中,forma t long g 对双精度,显示15位定点或浮点格式,由上图 可知,当输入较小的n 值5分别取10, 100, 1000, 100000, 100000000)的时候, 结果后面的指数中总是含有e-308,这和题目中的C 值很相似,我认为是由于分 母中的C 值相对于n 值过大,出现了 “大数吃小数”的现彖,这是不符合算法原 则的。

2:利用牛顿法求方程-1^ = 2于区间241的根,考虑不同初值下牛顿法的收敛情况。

解:牛顿法公式为:利用mat lab 编程function di2ti21 3i=l ;2 2.85208156699784 xO 二input ('输入初值x0:‘ );A 二[i x0];3 2.55030468822809 t=x0+ (x0-log (xO) -2) /(1-1/xO) ; %迭代函数4 1.91547247100476 三 while (abs (t _x0)>0.01)i=i+l; 5 0.37867158538991 xO 二 t; 6 0.774964959780275 A = [A;i xO];t =x0+(x0-log(xO)-2)/(1-1/xO): 7 4.11574081641933 cnd| 8 5.04162436446126 disp (A);96.81782826645596当输入初值二3的时候并不能收敛。

东南大学08级C++(下)上机试卷A和答案解析

东南大学08级C++(下)上机试卷A和答案解析

东南大学08级C++(下)上机试卷A和答案解析-CAL-FENGHAI.-(YICAI)-Company One1东南大学08级C++(下)上机试卷A和答案解析(考试时间80分钟,卷面成绩100分)学号姓名机位号说明:首先在Z盘建立一个以自己的学号命名的文件夹,用于存放上交的*.CPP 文件,考试结束前根据机房要求,将这个文件夹传送到网络服务器上,注意:提交时只保留文件夹中的CPP文件。

一、改错题(50分)【要求】调试程序,修改其中的语法错误及少量逻辑错误。

只能修改、不能增加或删除整条语句,但可增加少量说明语句和编译预处理指令。

【注意】源程序以“学号f1.cpp”命名,存入自己学号文件夹。

【题目】以下程序用于构造一个空的数组对象,通过调用插入函数建立按升序排列的数组,并输出数组内容。

【含错误的源程序】#include<iostream>#include<iomanip>using namespace std;class Array{int *p;int last; //最后一个元素下标public:Array(int=20); //创建一定长度的空表,给定长度缺省值为20~Array();void insertOrder(int); //在升序表中插入一个元素,使之仍然升序void print();};void Array::Array(int max){ //错误行last=-1;p=new int[]; //初始化为给定长度//错误行}Array::~Array(){delete p[];} //错误行void print(){ //错误行for(int i=0;i<=last;i++) cout<<setw(4)<<p[i];cout<<endl;}void Array::insertOrder(){ //将关键字插入到数组中某个位置//错误行if(last=-1){last++; p[last]=key;} //错误行int i=last;while(i>=0&&key<p[i]){p[i+1]=p[i]; //错误行i--;}p[i]=key; //错误行last++;}void main(){Array a(); //创建数组//错误行int t;for(int i=0;i<10;i++){ //读入10个数据创建一个升序数组cin>>t;a.insertOrder(int t); //错误行}print(); //输出数组//错误行}二、编程题(50分)【注意】源程序以“学号f2.cpp”命名,存入自己学号文件夹。

东南大学数学分析试题解答

东南大学数学分析试题解答

东南大学 数学分析试题解答 一、叙述定义(5分+5分=10分) 1.()+∞=-∞→x f x lim .解:设.)(,,0,0,0E M x f x E M >-<>∃><∀就有时则当δδ 2.当.)(,为极限不以时A x f a x +→解:设.)(,,0,0E A x f a x E >->->∃>∀时使得当δδ 二、计算(9分×7=63分)1. 求曲线210),1ln(2≤≤-=x x y 的弧长。

解:=+=⎰dx x f s βα2)]('[1⎰⎰⎰-=-++-=-+=--+2102102221022213ln )11111(11)12(1dx x x dx x x dx x x 2. 设都具有一阶连续与且己知g f x y z e x g z y x f u y ,sin ,0),,(),,,(2===偏导数,.,0dxduz g 求≠∂∂ 解:由xzz f x y y f x f dx du dz g dy g e dx xg z e x g yy∂∂⋅∂∂+∂∂⋅∂∂+∂∂==++=从而知,02,0),,(3212=32121)cos 2(cos f g e x xg f x f y ⋅++⋅+ 3.求⎰dx xx 2)ln (解:令⎰====dx x x dt e dx e x x t tt2)ln (,,,ln 则⎰⋅dt e et tt 22=⎰=-dt e t t 2t t te e t ----22 C e t+--2C xx x +++-=2ln 2)(ln 2 4.求()2lim x a x a xxx -+→()0>a解:()2lim xa x a x xx -+→==22222220)]()(ln 2ln 1[)}(]11)[(ln 2ln 1{lim xx o a x a x x o a a x a x x +++-+++++=→ =aa21+ 5.计算第二型曲面积分⎰⎰++Sdxdy z dzdx y dydz x ,222其中S 是曲面22y x z +=夹于0=z 与1=z 之间的部分,积分沿曲面的下侧。

C++上机考试题,上机练习,东南大学C++上机实验

C++上机考试题,上机练习,东南大学C++上机实验(共32页) -本页仅作为预览文档封面,使用时请删除本页-定义一个复数类,通过重载运算符:=、+=、-=、+、-、*、/、= =、!=,直接实现两个复数之间的各种运算。

编写一个完整的程序(包括测试各运算符的程序部分)。

*/#include ""void Word (char *s ); 动态生成字符数组空间,用形参s来对其进行初始化。

2. char & operaror[ ](int n )给下标值为n的数组元素赋值。

下标运算符[ ]的重载关键是将下标值做为一个操作数。

它的实现非常简单,就是用字符指针的首地址str加下标值n,然后将相加后的地址返回。

3. void disp( ); 实现将字符指针str指向的字符串输出到屏幕上。

4. 用~ Word()析构函数来释放动态申请的堆空间。

*/# include<># include<>class Word {private :char *str;int len;public :Word(char *s) *//*编写一个程序,输入N个学生数据,包括学号、姓名、C++成绩,要求输出这些学生的数据、平均分与成绩等级。

提示:设计一个学生类Stud,除了包括id(学号)、name(姓名)和C(成绩)数据成员外,还有两个静态成员数据sum和num,分别存放总分和人数,另有两个普通成员函数setdata()和print(),分别用于给数据成员赋值和输出数据成员的值,另有一个静态成员函数avg(),它用于计算平均分,并输出平均分。

同时设计一个友元函数,输出成绩对应的等级:大于等于90:优;80~90:良;70~79:中;60~69:及格;小于60:不及格。

在main()函数中定义了一个对象数组用于存储输入的学生数据,设计一个完整的程序。

*/#include ""#include ""#include ""class Stud{int id;char *name;int cpp;public:static float sum,num;etdata(name,id,cpp);}for(i=0;i<n;i++) {pstu[i].print();printgrade(pstu[i]);}cout<<Stud::num<<"个学生平均分: "<<Stud::avg()<<endl;}/*1. 实现描述超市的的类 Suppermacket 类,记录系统中现有商品(用指针实现),定义增加商品的函数 Append ,删除商品的函数 Delete ,查询商品的函数 Query,并显示查询结果;2. 定义商品类 Goods ,具有商品名称Name,商品价格Price,商品数量number等属性,操作 Sale (销售商品,余额不足时给予提示)、Add(商品上架操作)和ShowMe(显示商品信息)。

东南大学_数值分析_第六章_常微分方程数值解法

第六章 常微分方程数值解法——RK 4法、AB 4法******(学号) *****(姓名)上机题目要求见教材P307,23题。

一、算法原理题目要求采用RK 4法和AB 4法求解最简单的常微分方程初值问题(,),()y f x y a x by a η'=≤≤⎧⎨=⎩ (1)为求解式(1),采用离散化方法,就是寻求解)(x y 在区间],[b a 上的一系列点<<<<<n x x x x 321上的近似值 ,,,,21n y y y 。

记1(1,2,)i i i h x x i -=-=表示相邻两个节点的间距,称为步长。

求微分方程数值解的主要问题:(1) 如何将微分方程(,)y f x y '=离散化,并建立求其数值解的递推公式; (2) 递推公式的局部截断误差、数值数n y 与精确解)(n x y 的误差估计; (3) 递推公式的稳定性与收敛性. a) Runge-Kutta 方法基本思想:通过在1[,]i i x x +多预报几个点求斜率,并将其加权平均作为k *的近似值,以此构造更高精度的计算公式。

如果每步计算四次函数 的值,完全类似的,可以导出局部截断误差为)(5h O 的四阶Runge-Kutta 公式(RK 4):1123412132431(22),6(,),(,),221(,),22(,).n n n n n n n n n n y y k k k k k f x y h h k f x y k h k f x h y k k f x h y hk +⎧=++++⎪⎪=⎪⎪⎪=++⎨⎪⎪=++⎪⎪=++⎪⎩ (2)b) Adams 显式公式Runge-Kutta 方法是单步法,计算1+n y 时,只用到n y , 而已知信息1-n y 、2-n y 等没有被直接利用。

可以设想如果充分利用已知信息1-n y ,2-n y ,…来计算1+n y ,那么不但有可能提高精度,而且大大减少了计算量,这就是构造所谓线性多步法的基本思想。

东南大学数值分析编程作业

数值分析编程作业******学号:******指导老师:***目录P20.第17题:舍入误差与有效数 (3)P56.第20题:Newton迭代法 (5)P126.第39题:列主元Gauss消去法 (13)P127.第40题:逐次超松弛迭代法 (16)P195.第37题:3次样条插值函数 (22)P256.第23题:重积分的计算 (24)P307.第23题:常微分方程初值问题数值解 (26)P346.第10题:抛物方程Crank-Nicolson格式 (31)注:源程序放在对应的文件夹里,如第一题放在“P20.第17题:舍入误差与有效数”文件夹里;P20.第17题:舍入误差与有效数设2211311,--122N N+1NN j S j ==-∑其精确值为()。

(1)编制按从小到大的顺序222111+++2-13-1N -1N S =⋅⋅⋅⋅⋅,计算N S 的通用程序; (2)编制按从小到大的顺序222111+++N -1N-1-12-1N S =⋅⋅⋅⋅⋅(),计算N S 的通用程序; (3)按两种顺序分别计算210S ,410S ,610S ,并指出有效位数(编制程序时用单精度); (4)通过本上机题你明白了什么?答 (1)(2)程序:程序放在computation.m, goon.m 文件里,运行程序时只需输入命令main(3)运行结果:N=100时,S1有6位有效数字,S2都是有效数字N=10000时,S1有4位有效数字,S2都是有效数字N=1000000时,S1有3位有效数字,S2都是有效数字(4)体会:当N从小到大变化时,SN的项从大到小,反之SN的项从小到大。

从运算结果可见,第一种计算结果总是比第2、3种计算结果小,这是由于大数吃小数的原因(计算机表示一个数值是用字节表示的,当程序进行计算时,先将第一项和第二项相加,然后再加第三项……所以加到后面会由于项的值很小,不能加到这个字节里,所以就被忽略了。

数值分析上机题答案

20.(上机题)舍入误差与有效数 设∑=-=N j N j S 2211,其精确值为)11123(21+--N N 。

(1)编制按从小到大的顺序11131121222-+⋅⋅⋅+-+-=N S N ,计算N S 的通用程序。

(2)编制按从大到小的顺序1211)1(111222-+⋅⋅⋅+--+-=N N S N ,计算N S 的通用程序。

(3)按两种顺序分别计算642101010,,S S S ,并指出有效位数。

(编制程序时用单精度)(4)通过本上机题,你明白了什么?c++代码:#include <iostream.h>#include <fstream.h>void main(){float S1,S2,S=0.0,N,j;fstream myfile; //定义文件myfile.open("chap0.txt",ios::in|ios::out);for (int i=0;i<3;i++){do //读入三组数据{cout<<"请输入N 值:";cin>>N;cout<<endl;myfile<<"当N = "<<N<<" 时"<<endl<<endl;}while (N<2);S=(float) ((1.5-(1.0/N)-(1.0/(N+1)))/2);myfile<<"精确值S=:"<<S<<endl<<endl;S1=0.0;S2=0.0;for (j=2;j<=N;j++) S1=S1+(float) (1.0/(j*j-1.0));for (j=N;j>=2;j--) S2=S2+(float) (1.0/(j*j-1.0));myfile<<"按从大到小的顺序求和结果S1=:"<<S1<<endl<<endl;myfile<<"按从小到大的顺序求和结果S2=:"<<S2<<endl<<endl;}myfile.close();}输出结果:当N = 100 时精确值S=:0.740049按从大到小的顺序求和结果S1=:0.740049 有效位数6按从小到大的顺序求和结果S2=:0.74005 有效位数5当N = 10000 时精确值S=:0.7499按从大到小的顺序求和结果S1=:0.749852 有效位数 4按从小到大的顺序求和结果S2=:0.7499 有效位数 4当N = 1000000 时精确值S=:0.749999按从大到小的顺序求和结果S1=:0.749852 有效位数 4按从小到大的顺序求和结果S2=:0.749999 有效位数 6体会:通过本题,我认识到了舍入误差对计算结果的影响,所以必须选择合适的计算方法,尽量减少这种误差的影响。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

东南大学数值分析上机题答案(总22页)

--本页仅作为文档封面,使用时请直接删除即可-- --内页可以根据需求调整合适字体及大小-- 数值分析上机题 第一章 17.(上机题)舍入误差与有效数 设NjNjS2211,其精确值为)111-23(21NN。

(1)编制按从大到小的顺序1-1···1-311-21222NSN,计算NS的通用程序; (2)编制按从小到大的顺序121···1)1(111222NNSN,计

算NS的通用程序; (3)按两种顺序分别计算210S,410S,610S,并指出有效位数(编制程序时用单精度); (4)通过本上机题,你明白了什么? 解: 程序:

(1)从大到小的顺序计算1-1···1-311-21222NSN: function sn1=fromlarge(n) %从大到小计算sn1 format long; sn1=single(0); for m=2:1:n sn1=sn1+1/(m^2-1); end end

(2)从小到大计算121···1)1(111222NNSN function sn2=fromsmall(n) %从小到大计算sn2 format long; sn2=single(0); for m=n:-1:2 sn2=sn2+1/(m^2-1); end end (3) 总的编程程序为: function p203() clear all format long; n=input('please enter a number as the n:') sn=1/2*(3/2-1/n-1/(n+1));%精确值为sn fprintf('精确值为%f\n',sn); sn1=fromlarge(n); fprintf('从大到小计算的值为%f\n',sn1); sn2=fromsmall(n); fprintf('从小到大计算的值为%f\n',sn2); function sn1=fromlarge(n) %从大到小计算sn1 format long; sn1=single(0); for m=2:1:n sn1=sn1+1/(m^2-1); end end function sn2=fromsmall(n) %从小到大计算sn2 format long; sn2=single(0); for m=n:-1:2 sn2=sn2+1/(m^2-1); end end end 运行结果: 4 从而可以得到 N值 真值 顺序 值 有效位数 210

从大到小 5

从小到大 6 410

从大到小 3

从小到大 6 610

从大到小 3

从小到大 6 (4)感想: 通过本上机题,我明白了,从小到大计算数值的精确位数比较高而且与真值较为接近,而从大到小计算数值的精确位数比较低。机器数在进行加法运算时,用从大到小的顺序容易出现大数吃小数的情况,容易产生较大的误差,是因为对于相加的两个数值,计算机首先提供与大数相一致的位数,此时将小数的尾数向右移位,并进行四舍五入,之后对尾数进行依次相加。从大到小时,越往后计算,相加的数越小,从而出现大数吃小数的情况。相比之下。从小到大计算时,每次小数与大数相加,都会增加位数,从而精确度比较高。

第二章 20.(上机题)Newton迭代法 (1)给定初值0x及容许误差ε,编制Newton法解方程)(xf=0根的通用程序。 (2)给定方程xxxf3/)(3,易知其有三个根1x=-3,2x=0,3x=3。

①有Newton方法的局部收敛性可知存在δ>0,当0x(-δ,δ)时Newton迭代序列收敛于根2x,试确定尽可能大的δ; ②试取若干初始值,观察当0x(-∞,-1),(-1,-δ),(-δ,δ),(δ,1),(1,+∞)时Newton序列是否收敛以及收敛于哪一个根。 (3)通过本上机题,你明白了什么? 解: (1)程序 先编写函数function文件: 文件 %定义函数f(x) function Fx=fx(x) Fx=x^3/3-x;

文件 %定义导函数df(x)% function fx=dfx(x) fx=x^2-1;

接下来是具体步骤 文件求尽可能大的delta值 %%课本56页计算最大delta值 clear flag=1; k=1; x0=0; while flag==1 delta=k*10^-6; x0=delta; k=k+1; m=0; flag1=1; while flag1==1&&m<=10^3 x1=x0-fx(x0)/dfx(x0); if abs(x1-x0)<10^-6 flag1=0; end m=m+1; x0=x1; end if flag1==1||abs(x0)>=10^-6 flag=0; end end fprintf('%f\n',delta);

文件求方程的根 %%课本56页newton法求方程的根,确定收敛于哪个根 format long; ef=1e-6; k=0; x0=input('please enter the initial number as the x0:'); while k<1000 x1=x0-fx(x0)/dfx(x0); if abs(x1-x0) break end x0=x1; k=k+1; end fprintf('方程的根为%f\n',x0); 7 8

(2)运行结果 ① 求尽可能大的delta值

② 判断收敛于哪个根。已知有三个根,1x=-3,2x=0,3x=3。,(-1,-δ),(-δ,δ),(δ,1),(1,+∞)

0x(-∞,-1)

收敛于1x=-3 0x(-1,-δ)

可见部分收敛于1x,部分收敛于3x。 0x(-δ,δ) 10 可见,收敛于2x=0。

0x(δ,1) 11 可见部分收敛于1x,部分收敛于3x。

0x(1,∞) 12 收敛于3x (3)感想:通过自行编写NEWTON的程序,加深了我对于NEWTON迭代法具体的运行方式、结果、利弊的了解。在不同的区间上,根据给定的x0的不同,x会以不同的速度收敛于某个根,也会产生意想不到的跳动,如在(1,∞)区间是。因此给定初值的重要性很大,即在某些区间上,收敛于某个根是由一定限制的,要取得合适的初值,才能够正确地求得收敛的根。总体上来说,通过上机,巩固学习了第二章关于迭代的运用。

第三章 39.列主元Gauss消去法 对于某电路的分析,归结为求解线性方程组RIV。其中3113000100001335901100000931100000000107930000900030577050000074730000000030410000005002720009000229R



















15,27,23,0,20,12,7,7,10TTV

(1) 编制解n阶线性方程组Axb的列主元高斯消去法的通用程序; (2) 用所编程序线性方程组RIV,并打印出解向量,保留5位有效数; (3) 本章编程之中,你提高了哪些编程能力? 解: (1) 程序 Gauss函数的function程序 %用列主元Gauss消去法求解线性方程组Ax=b function [x]=gauss1(A,b) n=length(b); for k=1:n a=max(A(k:n,k)); [p m]=find(A(:,k)==a); if p>k A([p,k],:)=A([k,p],:); b([p,k],:)=b([k,p],:); end m=A(k+1:n,k)/A(k,k); A(k+1:n,k+1:n)=A(k+1:n,k+1:n)-m*A(k,k+1:n); b(k+1:n)=b(k+1:n)-m*b(k); A(k+1:n,k)=zeros(n-k,1); end x=zeros(n,1); x(n)=b(n)/A(n,n); for i=n-1:-1:1 m=0; for k=i+1:1:n m=m+A(i,k)*x(k);

相关文档
最新文档