汇编数值转换器大作业解读

汇编数值转换器大作业解读
汇编数值转换器大作业解读

《汇编语言程序设计》

综合程序设计实验报告

题目:数制转换器

班级:信1101-2班

姓名:王兵茹李夏蕾

胡佳奇

学号:20112917 20112912

20113013

完成日期:2013-11-24

目录

一、简介

二、小组成员及具体分工

三、需求分析与设计

四、代码及分析

五、总结

一、简介

本设计利用汇编语言来实现数制转换设计,用于方便进制之间的互换。设计的内容可以使十六进制、八进制、二进制、十进制的数制互相转换。

二.小组成员及具体分工

小组成员:王兵茹李夏蕾胡佳奇

具体分工:我们三个一开始是各自的分工查资料,先看看单个数制转换,王兵茹负责的是十六进制,李夏蕾负责的是十进制,胡佳琪负责的是二

进制。

最后我们几个一起完成了程序的主要设计,由于大体思路相同,最后加上了八进制的转换。

在程序的修改方面,王兵茹进行了后期的加工,增加了dios中断,把单调的退出改成文本形式下的退出,在退出之前,执行清屏。

最后我们几个商量着完成了实验报告和ppt的制作,经过我们几个人的努力,虽然做的不是特别好,但还是各有收获。

三、需求分析与设计

●需求分析

通过编程实现显示菜单,然后通过键盘输入菜单相应的选项进入相应的数制转换,然后通过选项对应的子程序跳转来实现转换,子程序中通过宏定义定义数制前后的数制,并且在宏定义过程中实现数制转换算法,最后输出转换后的进制数。

●设计

①运行的设计框图

②整个系统的设计框图

③子程序之间调用关系框图

我们的这个程序主要就是用到的子程序的调用和大量的宏定义,对于输入时的宏定义有charin,strin,numin,输出时的宏定义有charout,strout,numout,输出的时候用到的是栈push和pop,在压栈push时,用到了irp不定重复伪操作。

定义通用inax宏,确定转换之前的进制,例如inax cx、cx=2是把转换之前的进制确定为2存到cx中

定义通用outax宏,确定转换之后的进制,例如outax bx、bx=2是把转换之后的进制确定为2存到bx中

通用宏charin逐个输入转换之前进制字符

四、代码及分析

程序运行源代码如下:

;******************************************************************** *****************

data segment

space db 1000 dup(' ')

str1 db 10 dup(' '),9 dup(' '),'Welcome to shuzhizhuanhuan!!!',52 dup(' ')

str12 db 240 dup (' '),9 dup(' '),'Thank you!!!',412 dup(' ')

clear_screen MACRO ;清屏宏定义

mov ah,06h

mov al,0

mov bh,0f0h ;白底黑字

mov ch,0 ;从0行0列到23行79列清屏

mov cl,0

mov dh,23

mov dl,79

int 10h

mov dx,0 ;光标在左上角

mov ah,2

int 10h ;调用bios

ENDM

menu db 10,13,'*************************************************' db10,13,'*************************************************'

db10,13,'* please choice action: *'

db10,13,'* a.binary 2 to octal 8 *'

db10,13,'* b.binary 2 to decimal 10 *'

db10,13,'* c.binary 2 to hexadecimal 16 *'

db10,13,'* d.octal 8 to binary 2 *'

db10,13,'* e.octal 8 to decimal 10 *'

db10,13,'* f.octal 8 to hexadecimal 16 *'

db10,13,'* g.decimal 10 to binary 2 *'

db10,13,'* h.decimal 10 to octal 8 *'

db10,13,'* i.decimal 10 to hexadecimal 16 *'

db10,13,'* j.hexadecimal 16 to binary 2 *'

db10,13,'* k.hexadecimal 16 to octal 8 *'

db10,13,'* l.hexadecimal 16 to decimal 10 *'

db10,13,'* m.exit *'

db

10,13,'*************************************************',10,13,' $'

;**************************************************************

;2进制转换为16进制和10进制和8进制

str2 db10,13,'please input the binary string:',10,13, '$'

str21 db'the hexadecimal string is:',10,13, '$'

str22 db'the decimal string is:',10,13, '$'

str23 db'the octal string is:',10,13, '$'

;16进制转换为2进制和8进制和10进制

str3 db10,13,'please input the hexadecimal string:',10,13, '$' str31 db'the binary string is:',10,13, '$'

str32 db'the octal string is:',10,13, '$'

str33 db'the decimal string is:',10,13, '$'

;10进制转换为2进制和8进制和16进制

str4 db10,13,'please input the decimal string:',10,13, '$'

str41 db'the binary string is:',10,13, '$'

str42 db'the octal string is:',10,13, '$'

str43 db'the hexadecimal string is:',10,13, '$'

;8进制转换为2进制和10进制和16进制

str5 db10,13,'please input the octal string:',10,13, '$'

str51 db'the binary string is:',10,13, '$'

str52 db'the decimal string is:',10,13, '$'

str53 db'the hexadecimal string is:',10,13, '$'

str0 db 10,13,'ERROR! please input a~m:',13,10,'$'

;在数据段定义字符,数字,字符串的输入输出的宏定义

;*************************************************

charin macro ;字符输入

mov ah,01h

int 21h

endm

;************************************************

numin macro ;数字输入

charin ;调用charin宏定义

sub al,48 ;48d=30h,将字符转换为数字

endm

;****************************************************

strin macro stringin ;字符串输入

lea dx,stringin

mov ah,0ah

int 21h

endm

;****************************************************

charout macro outchar ;字符输出

irp rec,;不定重复伪操作

push rec

endm

;push ax

;push dx

mov dl, outchar

mov ah, 02h

int 21h

pop dx

pop ax

endm

;*************************************************** numout macro outnum ;数字输出

push ax

push dx

mov dl, outnum

add dl, 48

mov ah, 02h

int 21h

pop dx

pop ax

endm

;**************************************************

strout macro stringout ;字符串输出

push ax

push dx

lea dx, stringout

mov ah, 9

int 21h

pop dx

pop ax

endm

data ends

stack segment stack

dw 200 dup(?)

stack ends

;*************************************************

code segment

assume cs:code,ds:data,es:data,ss:stack

;******************************************************** endl macro

irp x,;不定重复伪操作

push x

endm

;push ax

;push bx

;push cx

;push dx

mov dl, 0ah ;回车换行

mov ah, 2

int 21h

mov dl, 0dh

int 21h

pop dx

pop cx

pop bx

pop ax

endm

;******************************************************* outax macro basenum

push ax

push bx

push cx

push dx

mov bx, basenum

call outaxp

pop dx

pop cx

pop bx

pop ax

endm

;******************************************************* outaxp proc

mov dx,0

mov cx,0

outaxp_circle:

cmp ax,0

je outaxp_next

div bx

push dx

mov dx,0

jmp outaxp_circle

outaxp_next:

pop ax

cmp al,10

jb nout

add al,55 ;55d=37h

charout al

jmp cout

nout:

numout al

cout:

loop outaxp_next

ret

outaxp endp

;************************************************** inax macro basenum

push bx

push cx

push dx

mov cx, basenum

call inaxp

pop dx

pop cx

pop bx

endm

;************************************************ inaxp proc

mov ax, 0

inaxp0:

push ax

inaxp1: charin

cmp al, 13 ;判断输入的是不是回车

je inaxe

cmp al, '0'

jb inaxp1

cmp al, '9'

ja inaxnext1

sub al, 48

jmp inaxnum

inaxnext1:

cmp al, 'A'

cmp al, 'F'

ja inaxnext2

sub al, 55

jmp inaxnum

inaxnext2:

cmp al, 'a'

jb inaxp1

cmp al, 'z'

ja inaxp1

sub al, 87

jmp inaxnum

inaxnum:

mov bh, 0

mov bl, al

pop ax

cmp ax, 0

je inaxadd

mul cx

inaxadd:

add ax, bx

jmp inaxp0

inaxe:

pop ax

ret

inaxp endp

;*************************************************** start:

mov ax,data

mov ds,ax

mov es,ax

lea bp,space

mov dx,0b00h

mov cx,1000

mov bx,0020h

mov ax,1300h

int 10h

lea bp,str1;显示welcome

mov dx,0600h

mov cx,120

mov bx,000eh

mov ax,1301h

int 10h

display:

strout menu

charin

cmp al,'a'

je bin2_oct8

jl err

cmp al,'b'

je bin2_dec10

cmp al,'c'

je bin2_hex16

cmp al,'d'

je oct8_bin2

cmp al,'e'

je oct8_dec10

cmp al,'f'

je oct8_hex16

cmp al,'g'

je dec10_bin2

cmp al,'h'

je dec10_oct8

cmp al,'i'

je dec10_hex16

cmp al,'j'

je hex16_bin2

cmp al,'k'

je hex16_oct8

cmp al,'l'

je hex16_dec10

cmp al,'m'

je exit

cmp al,'n'

jnl err

clear_screen

jmp display

err:

strout str0

jmp display

;***************************************************** bin2_hex16: ;二进制转换

strout str2

inax 2

endl

strout str21

outax 16

jmp display

bin2_dec10:

strout str2

inax 2

endl

strout str22

outax 10

jmp display

bin2_oct8:

strout str2

inax 2

endl

strout str23

outax 8

jmp display

;************************************************* hex16_bin2: ;十六进制转换

strout str3

inax 16

endl

strout str31

outax 2

jmp display

hex16_oct8:

strout str3

inax 16

endl

strout str32

outax 8

jmp display

hex16_dec10:

strout str3

inax 16

endl

strout str33

outax 10

jmp display

;**************************************************** dec10_bin2: ;十进制转换

strout str4

inax 10

endl

strout str41

outax 2

jmp display

dec10_oct8:

strout str4

inax 10

endl

strout str42

outax 8

jmp display

dec10_hex16:

strout str4

inax 10

endl

strout str43

outax 16

jmp display

;*********************************************************** oct8_bin2: ;八进制转换

strout str4

inax 8

endl

strout str41

outax 2

jmp display

oct8_dec10:

strout str4

inax 8

endl

strout str42

outax 10

jmp display

oct8_hex16:

strout str4

inax 8

endl

strout str43

outax 16

jmp display

;********************************************************** exit: clear_screen ;调用宏定义,清屏

lea bp,str12

mov dx,0600h

mov cx,520

mov bx,004eh

mov ax,1301h

int 10h

mov ah,4ch

int 21h

;********************************************************** code ends

end start

程序运行结果截图:(包括正确输入和错误输入)

五、总结

本次大作业,考虑到我们平时对数制转换的应用,并且各个进制转换起来使人头痛,我们组做的是一个数制转换器。

我们实现的就是各个数制之间的转换,一共有12个,在实现数制转换中,我们用到的有子程序的调用,还有就是广泛应用了宏定义,主要是想是下面的程序调用起来更方便直接。

在这次实验中我们也遇到了不少的问题,本来一开始我们打算做一个windows窗体,但是asm软件这部分不是免费的,所以我们只能做dos的界面了。还有就是在程序中子程序之间的调用,输入用到了宏,由于是各个进制之间的转换,有数字也有字符,所以光输入就用到了charin,strin,numin等通用的宏定义,在宏定义中由于有push和pop的多次操作,我们就用irp不定重复伪操作来实现的。在输出的时候用到的宏有charout,strout,numout。

后来有进行了改进,我们在一开始的界面加了文本颜色,由于能力有限,只有在第一次运行时有,在显示welcome是加到了bios中断,还有,在退出的时候,我们增加了一个thank you 的文本界面,也是用到了dios中断,int 10h,在显示这个界面前,我们调用了一个清屏宏。

总结这次大作业,虽然费了很大的劲,经过我们几个的商讨,结果还算令我们满意,在这次实验中,我们组的成员都很积极,都有自己的收获。

数值分析大作业-三、四、五、六、七

大作业 三 1. 给定初值 0x 及容许误差 ,编制牛顿法解方程f (x )=0的通用 程序. 解:Matlab 程序如下: 函数m 文件:fu.m function Fu=fu(x) Fu=x^3/3-x; end 函数m 文件:dfu.m function Fu=dfu(x) Fu=x^2-1; end 用Newton 法求根的通用程序Newton.m clear; x0=input('请输入初值x0:'); ep=input('请输入容许误差:'); flag=1; while flag==1 x1=x0-fu(x0)/dfu(x0); if abs(x1-x0)

while flag1==1 && m<=10^3 x1=x0-fu(x0)/dfu(x0); if abs(x1-x0)=ep flag=0; end end fprintf('最大的sigma 值为:%f\n',sigma); 2.求下列方程的非零根 5130.6651()ln 05130.665114000.0918 x x f x x +??=-= ?-???解:Matlab 程序为: (1)主程序 clear clc format long x0=765; N=100; errorlim=10^(-5); x=x0-f(x0)/subs(df(),x0); n=1; while nerrorlim n=n+1; else break ; end x0=x; end disp(['迭代次数: n=',num2str(n)]) disp(['所求非零根: 正根x1=',num2str(x),' 负根x2=',num2str(-x)]) (2)子函数 非线性函数f function y=f(x) y=log((513+0.6651*x)/(513-0.6651*x))-x/(1400*0.0918); end

数值分析大作业三 四 五 六 七

大作业 三 1. 给定初值 0x 及容许误差 ,编制牛顿法解方程f (x )=0的通用程序. 解:Matlab 程序如下: 函数m 文件:fu.m function Fu=fu(x) Fu=x^3/3-x; end 函数m 文件:dfu.m function Fu=dfu(x) Fu=x^2-1; end 用Newton 法求根的通用程序Newton.m clear; x0=input('请输入初值x0:'); ep=input('请输入容许误差:');

flag=1; while flag==1 x1=x0-fu(x0)/dfu(x0); if abs(x1-x0)

while flag==1 sigma=k*eps; x0=sigma; k=k+1; m=0; flag1=1; while flag1==1 && m<=10^3 x1=x0-fu(x0)/dfu(x0); if abs(x1-x0)=ep flag=0;

end end fprintf('最大的sigma 值为:%f\n',sigma); 2.求下列方程的非零根 5130.6651()ln 05130.665114000.0918 x x f x x +?? =-= ?-???解: Matlab 程序为: (1)主程序 clear clc format long x0=765; N=100; errorlim=10^(-5); x=x0-f(x0)/subs(df(),x0); n=1;

数值分析作业答案

数值分析作业答案 插值法 1、当x=1,-1,2时,f(x)=0,-3,4,求f(x)的二次插值多项式。 (1)用单项式基底。 (2)用Lagrange插值基底。 (3)用Newton基底。 证明三种方法得到的多项式是相同的。 解:(1)用单项式基底 设多项式为: , 所以: 所以f(x)的二次插值多项式为: (2)用Lagrange插值基底 Lagrange插值多项式为: 所以f(x)的二次插值多项式为: (3) 用Newton基底: 均差表如下: xk f(xk) 一阶均差二阶均差 1 0 -1 -3 3/2 2 4 7/ 3 5/6 Newton插值多项式为: 所以f(x)的二次插值多项式为: 由以上计算可知,三种方法得到的多项式是相同的。 6、在上给出的等距节点函数表,若用二次插值求ex的近似值,要使截断误差不超过10-6,问使用函数表的步长h应取多少? 解:以xi-1,xi,xi+1为插值节点多项式的截断误差,则有 式中 令得 插值点个数

是奇数,故实际可采用的函数值表步长 8、,求及。 解:由均差的性质可知,均差与导数有如下关系: 所以有: 15、证明两点三次Hermite插值余项是 并由此求出分段三次Hermite插值的误差限。 证明:利用[xk,xk+1]上两点三次Hermite插值条件 知有二重零点xk和k+1。设 确定函数k(x): 当或xk+1时k(x)取任何有限值均可; 当时,,构造关于变量t的函数 显然有 在[xk,x][x,xk+1]上对g(x)使用Rolle定理,存在及使得 在,,上对使用Rolle定理,存在,和使得 再依次对和使用Rolle定理,知至少存在使得 而,将代入,得到 推导过程表明依赖于及x 综合以上过程有: 确定误差限: 记为f(x)在[a,b]上基于等距节点的分段三次Hermite插值函数。在区间[xk,xk+1]上有 而最值 进而得误差估计: 16、求一个次数不高于4次的多项式,使它满足,,。

数值计算方法大作业

目录 第一章非线性方程求根 (3) 1.1迭代法 (3) 1.2牛顿法 (4) 1.3弦截法 (5) 1.4二分法 (6) 第二章插值 (7) 2.1线性插值 (7) 2.2二次插值 (8) 2.3拉格朗日插值 (9) 2.4分段线性插值 (10) 2.5分段二次插值 (11) 第三章数值积分 (13) 3.1复化矩形积分法 (13) 3.2复化梯形积分法 (14) 3.3辛普森积分法 (15) 3.4变步长梯形积分法 (16) 第四章线性方程组数值法 (17) 4.1约当消去法 (17) 4.2高斯消去法 (18) 4.3三角分解法 (20)

4.4雅可比迭代法 (21) 4.5高斯—赛德尔迭代法 (23) 第五章常积分方程数值法 (25) 5.1显示欧拉公式法 (25) 5.2欧拉公式预测校正法 (26) 5.3改进欧拉公式法 (27) 5.4四阶龙格—库塔法 (28)

数值计算方法 第一章非线性方程求根 1.1迭代法 程序代码: Private Sub Command1_Click() x0 = Val(InputBox("请输入初始值x0")) ep = Val(InputBox(请输入误差限ep)) f = 0 While f = 0 X1 = (Exp(2 * x0) - x0) / 5 If Abs(X1 - x0) < ep Then Print X1 f = 1 Else x0 = X1 End If Wend End Sub 例:求f(x)=e2x-6x=0在x=0.5附近的根(ep=10-10)

1.2牛顿法 程序代码: Private Sub Command1_Click() b = Val(InputBox("请输入被开方数x0")) ep = Val(InputBox(请输入误差限ep)) f = 0 While f = 0 X1 = x0 - (x0 ^ 2 - b) / (2 * b) If Abs(X1 - x0) < ep Then Print X1 f = 1 Else x0 = X1 End If Wend End Sub 例:求56的值。(ep=10-10)

数值分析大作业

数值分析报大作业 班级:铁道2班 专业:道路与铁道工程 姓名:蔡敦锦 学号:13011260

一、序言 该数值分析大作业是通过C语言程序编程在Microsoft Visual C++ 6.0编程软件上运行实现的。本来是打算用Matlab软间来计算非线性方程的根的。学习Matlab也差不多有一个多月了,感觉自己编程做题应该没什么问题了;但是当自己真心的去编程、运行时才发现有很多错误,花了一天时间修改、调试程序都没能得到自己满意的结果。所以,我选择了自己比较熟悉的C程序语言来编程解决非线性的求值问题,由于本作业是为了比较几种方法求值问题的收敛速度和精度的差异,选择了一个相对常见的非线性函数来反映其差异,程序运行所得结果我个人比较满意。编写C语言,感觉比较上手,程序出现问题也能比较熟练的解决。最终就决定上交一份C程序语言编程的求值程序了!

二、选题 本作业的目的是为了加深对非线性方程求根方法的二分法、简单迭代法、、牛顿迭代法弦截法等的构造过程的理解;能将各种方法的算法描述正确并且能够改编为程序并在计算机上实现程序的正确合理的运行,能得到自己满意的结果,并且能调试修改程序中可能出现的问题和程序功能的增减修改。本次程序是为了比较各种方法在求解同一非线性方程根时,在收敛情况上的差异。 为了达到上面的条件我选择自己比较熟悉的语言—C语言来编程,所选题目为计算方程f(x)=x3-2x-5=0在区间[2,3]内其最后两近似值的差的绝对值小于等于5 ?的根的几种方法的比较。 110- 本文将二分法、牛顿法、简单迭代法、弦截法及加速收敛法这五种方法在同一个程序中以函数调用的方式来实现,比较简洁明了,所得结果能很好的比较,便于分析;发现问题和得出结论。

北航数值分析大作业一

《数值分析B》大作业一 SY1103120 朱舜杰 一.算法设计方案: 1.矩阵A的存储与检索 将带状线性矩阵A[501][501]转存为一个矩阵MatrixC[5][501] . 由于C语言中数组角标都是从0开始的,所以在数组MatrixC[5][501]中检索A的带内元素a ij的方法是: A的带内元素a ij=C中的元素c i-j+2,j 2.求解λ1,λ501,λs ①首先分别使用幂法和反幂法迭代求出矩阵按摸最大和最小的特征值λmax和λmin。λmin即为λs; 如果λmax>0,则λ501=λmax;如果λmax<0,则λ1=λmax。 ②使用带原点平移的幂法(mifa()函数),令平移量p=λmax,求 出对应的按摸最大的特征值λ,max, 如果λmax>0,则λ1=λ,max+p;如果λmax<0,则λ501=λ,max+p。 3.求解A的与数μk=λ1+k(λ501-λ1)/40的最接近的特征值λik (k=1,2,…,39)。 使用带原点平移的反幂法,令平移量p=μk,即可求出与μk最接近的特征值λik。 4.求解A的(谱范数)条件数cond(A)2和行列式d etA。 ①cond(A)2=|λ1/λn|,其中λ1和λn分别是矩阵A的模最大和 最小特征值。

②矩阵A的行列式可先对矩阵A进行LU分解后,detA等于U所有对角线上元素的乘积。 二.源程序 #include #include #include #include #include #include #include #define E 1.0e-12 /*定义全局变量相对误差限*/ int max2(int a,int b) /*求两个整型数最大值的子程序*/ { if(a>b) return a; else return b; } int min2(int a,int b) /*求两个整型数最小值的子程序*/ { if(a>b) return b; else return a; } int max3(int a,int b,int c) /*求三整型数最大值的子程序*/ { int t; if(a>b) t=a; else t=b; if(t

北航数值分析大作业第二题精解

目标:使用带双步位移的QR 分解法求矩阵10*10[]ij A a =的全部特征值,并对其中的每一个实特征值求相应的特征向量。已知:sin(0.50.2)() 1.5cos( 1.2)(){i j i j ij i j i j a +≠+== (i,j=1,2, (10) 算法: 以上是程序运作的逻辑,其中具体的函数的算法,大部分都是数值分析课本上的逻辑,在这里特别写出矩阵A 的实特征值对应的一个特征向量的求法: ()[]()() []()[]()111111I 00000 i n n n B A I gause i n Q A I u Bu u λλ-?-?-=-?-?? ?-=????→=??????→= ?? ? 选主元的消元 检查知无重特征值 由于=0i A I λ- ,因此在经过选主元的高斯消元以后,i A I λ- 即B 的最后一行必然为零,左上方变 为n-1阶单位矩阵[]()()11I n n -?-,右上方变为n-1阶向量[]()11n Q ?-,然后令n u 1=-,则 ()1,2,,1j j u Q j n ==???-。

这样即求出所有A所有实特征值对应的一个特征向量。 #include #include #include #define N 10 #define E 1.0e-12 #define MAX 10000 //以下是符号函数 double sgn(double a) { double z; if(a>E) z=1; else z=-1; return z; } //以下是矩阵的拟三角分解 void nishangsanjiaodiv(double A[N][N]) { int i,j,k; int m=0; double d,c,h,t; double u[N],p[N],q[N],w[N]; for(i=0;i

上海大学_王培康_数值分析大作业

数值分析大作业(2013年5月) 金洋洋(12721512),机自系 1.下列各数都是经过四舍五入得到的近似值,试分别指出它 们的绝对误差限, 相对误差限和有效数字的位数。 X1 =5.420, x 2 =0.5420, x 3=0.00542, x 4 =6000, x 5=50.610? 解:根据定义:如果*x 的绝对误差限 不超过x 的某个数位的半个单位,则从*x 的首位非零数字到该位都是有效数字。 显然根据四舍五入原则得到的近视值,全部都是有效数字。 因而在这里有:n1=4, n2=4, n3=3, n4=4, n5=1 (n 表示x 有效数字的位数) 对x1:有a1=5, m1=1 (其中a1表示x 的首位非零数字,m1表示x1的整数位数) 所以有绝对误差限 143 11 (1)101022 x ε--≤ ?=? 相对误差限 31() 0.510(1)0.00923%5.4201 r x x x εε-?= == 对x2:有a2=5, m2=0 所以有绝对误差限 044 11 (2)101022 x ε--≤ ?=? 相对误差限 42() 0.510(2)0.00923%0.54202 r x x x εε-?= == 对x3:有a3=5, m3=-2 所以有绝对误差限 235 11 (3)101022 x ε---≤ ?=? 相对误差限 53() 0.510(3)0.0923%0.005423 r x x x εε-?= == 对x4:有a4=0, m4=4 所以有绝对误差限 4411(4)1022 x ε-≤?= 相对误差限 4() 0.5 (4)0.0083%6000 4 r x x x εε= = = 对x5:有a5=6, m5=5 所以有绝对误差限 514 11(5)101022 x ε-≤ ?=? 相对误差限 45() 0.510(5)8.3%600005 r x x x εε?= ==

北航数值分析报告第三次大作业

数值分析第三次大作业 一、算法的设计方案: (一)、总体方案设计: x y当作已知量代入题目给定的非线性方程组,求(1)解非线性方程组。将给定的(,) i i

得与(,)i i x y 相对应的数组t[i][j],u[i][j]。 (2)分片二次代数插值。通过分片二次代数插值运算,得到与数组t[11][21],u[11][21]]对应的数组z[11][21],得到二元函数z=(,)i i f x y 。 (3)曲面拟合。利用x[i],y[j],z[11][21]建立二维函数表,再根据精度的要求选择适当k 值,并得到曲面拟合的系数矩阵C[r][s]。 (4)观察和(,)i i p x y 的逼近效果。观察逼近效果只需要重复上面(1)和(2)的过程,得到与新的插值节点(,)i i x y 对应的(,)i i f x y ,再与对应的(,)i i p x y 比较即可,这里求解 (,)i i p x y 可以直接使用(3)中的C[r][s]和k 。 (二)具体算法设计: (1)解非线性方程组 牛顿法解方程组()0F x =的解* x ,可采用如下算法: 1)在* x 附近选取(0) x D ∈,给定精度水平0ε>和最大迭代次数M 。 2)对于0,1, k M =执行 ① 计算() ()k F x 和()()k F x '。 ② 求解关于() k x ?的线性方程组 () ()()()()k k k F x x F x '?=- ③ 若() () k k x x ε∞∞ ?≤,则取*()k x x ≈,并停止计算;否则转④。 ④ 计算(1) ()()k k k x x x +=+?。 ⑤ 若k M <,则继续,否则,输出M 次迭代不成功的信息,并停止计算。 (2)分片双二次插值 给定已知数表以及需要插值的节点,进行分片二次插值的算法: 设已知数表中的点为: 00(0,1,,) (0,1,,)i j x x ih i n y y j j m τ=+=???=+=?? ,需要插值的节点为(,)x y 。 1) 根据(,)x y 选择插值节点(,)i j x y : 若12h x x ≤+ 或12 n h x x ->-,插值节点对应取1i =或1i n =-,

数值分析第二次大作业

《数值分析》计算实习报告 第二题 院系:机械工程及自动化学院 学号: 姓名: 2017年11月

一、题目要求 试求矩阵A =[a ij ]10×10的全部特征值,并对其中的每一个实特征值求相应的特征向量,已知 a ij ={ sin (0.5i +0.2j ) i ≠j 1.52cos (i +1.2j ) i =j (i,j =1,2, (10) 说明: 1.用带双步位移的QR 方法求矩阵特征值,要求迭代的精度水平为ε=10?12。 2.打印以下内容: (1)全部源程序; (2)矩阵A 经过拟上三角化后所得的矩阵A (n?1); (3)对矩阵A (n?1)实行QR 方法迭代结束后所得的矩阵; (4)矩阵A 的全部特征值λi =(R i ,I i ) (i =1,2,?,10),其中R i =Re(λi ),I i = Im(λi ) 。若λi 是实数,则令I i =0; (5)A 的相应于实特征值的特征向量。 3.采用e 型数输出实型数,并且至少显示12位有效数字。 二、算法设计思路和方案 1. 将矩阵A 拟上三角化得到矩阵A (n?1) 为了减少计算量,一般先利用Householder 矩阵对矩阵A 作相似变换,把A 化为拟上三角矩阵A (n?1),然后用QR 方法计算A (n?1)的全部特征值,而A (n?1)的特征值就是A 的特征值。具体算法如下: 记(1)A A =,()r A 的第r 列至第n 列的元素为(r)(1,2, ,;,1,,)ij a i n j r r n ==+。 对于1,2,,2r n =-执行 (1)若() (2,3,,)r ir a i r r n =++全为零,则令(1)()r r A A +=,转(5);否则转(2)。

北航数值分析大作业第一题幂法与反幂法

《数值分析》计算实习题目 第一题: 1. 算法设计方案 (1)1λ,501λ和s λ的值。 1)首先通过幂法求出按模最大的特征值λt1,然后根据λt1进行原点平移求出另一特征值λt2,比较两值大小,数值小的为所求最小特征值λ1,数值大的为是所求最大特征值λ501。 2)使用反幂法求λs ,其中需要解线性方程组。因为A 为带状线性方程组,此处采用LU 分解法解带状方程组。 (2)与140k λλμλ-5011=+k 最接近的特征值λik 。 通过带有原点平移的反幂法求出与数k μ最接近的特征值 λik 。 (3)2cond(A)和det A 。 1)1=n λλ2cond(A),其中1λ和n λ分别是按模最大和最小特征值。 2)利用步骤(1)中分解矩阵A 得出的LU 矩阵,L 为单位下三角阵,U 为上三角阵,其中U 矩阵的主对角线元素之积即为det A 。 由于A 的元素零元素较多,为节省储存量,将A 的元素存为6×501的数组中,程序中采用get_an_element()函数来从小数组中取出A 中的元素。 2.全部源程序 #include #include void init_a();//初始化A double get_an_element(int,int);//取A 中的元素函数 double powermethod(double);//原点平移的幂法 double inversepowermethod(double);//原点平移的反幂法 int presolve(double);//三角LU 分解 int solve(double [],double []);//解方程组 int max(int,int); int min(int,int); double (*u)[502]=new double[502][502];//上三角U 数组 double (*l)[502]=new double[502][502];//单位下三角L 数组 double a[6][502];//矩阵A int main() { int i,k; double lambdat1,lambdat2,lambda1,lambda501,lambdas,mu[40],det;

北航数值分析大作业第二题

数值分析第二次大作业 史立峰 SY1505327

一、 方案 (1)利用循环结构将sin(0.50.2)() 1.5cos( 1.2)() {i j i j ij i j i j a +≠+==(i,j=1,2,……,10)进行赋值,得到需要变换的 矩阵A ; (2)然后,对矩阵A 利用Householder 矩阵进行相似变换,把A 化为上三角矩阵A (n-1)。 对A 拟上三角化,得到拟上三角矩阵A (n-1),具体算法如下: 记A(1)=A ,并记A(r)的第r 列至第n 列的元素为()n r r j n i a r ij ,,1,;,,2,1) ( +==。 对于2,,2,1-=n r 执行 1. 若 ()n r r i a r ir ,,3,2) ( ++=全为零,则令A(r+1) =A(r),转5;否则转2。 2. 计算 () ∑+== n r i r ir r a d 1 2 )( ()( )r r r r r r r r r r d c a d a c ==-=++则取,0sgn ) (,1)(,1若 )(,12r r r r r r a c c h +-= 3. 令 () n T r nr r r r r r r r r R a a c a u ∈-=++) ()(,2)(,1,,,,0,,0 。 4. 计算 r r T r r h u A p /)(= r r r r h u A q /)(= r r T r r h u p t /= r r r r u t q -=ω T r r T r r r r p u u A A --=+ω)()1( 5. 继续。 (3)使用带双步位移的QR 方法计算矩阵A (n-1)的全部特征值,也是A 的全部特征值,具体算法如下: 1. 给定精度水平0>ε和迭代最大次数L 。 2. 记n n ij n a A A ?-==][) 1()1()1(,令n m k ==,1。

数值分析大作业QR分解

题目:设计求取n n ?实数矩阵A 的所有特征值及其特征向量的数值算法,并以矩阵 20010-1-24A=0-2131 43 1?? ? ? ? ??? 为例进行具体的求解计算。 一、 算法分析: 一般而言,求取实数矩阵所有特征值的方法有雅克比法和QR 分解法,两者都是变换法。其中雅克比法只能求解对称矩阵的全部特征值和特征向量,而QR 则可用于更一般的矩阵特征值的求解,结合反幂法可进而求出各个特征向量。 二、 算法设计: 1、 原始实矩阵A R n n ?∈拟上三角化 为了减少求特征值和特征向量过程中的计算量,对生成的矩阵A 进行拟上三角化,得到拟上三角化矩阵A ’ 记A (1)=A ,并记A (r)的第r 列到第n 列的元素(1,2,...,;,1,...,)r ij a i n j r r n ==+。 对于r=1,2,…,n -2执行 (1) 若() (2,3,...,)r ir a i r r n =++全为零,则令A (r+1)= A (r),转(5);否则转(2)。 (2) 计算 令 ()2 ()() 1,1,1,sgn(0,sgn()=1) r r r r r r r r r r r c a a a ρ+++=-=,(若则取 (3) 令-0=r n r u u ?? ? ?? ,()()()-1,2,1(,,...,)r r r T n r r r r r r nr u a c a a ρ++=- (4) 计算 (r)(r)(r)T n-r r+1,r r r+2,r nr r T n-r T n-r n-r n-r n-r r+1r 1u = (a -c ,a ,...,a )ρ I H =I -2uu =H H =I -2u u A =HA H ?? ? ?? (5) 继续 算法执行完后,就得到与原矩阵A 相似的拟上三角矩阵A (n-1)。 2、 拟上三角矩阵QR 分解的求原矩阵的全部特征值 记A k 是对拟上三角矩阵进行QR 算法,产生的矩阵序列,A 0是起始拟上三角矩阵,

数值分析大作业 三、四、五、六、七

大作业 三 1. 给定初值0x 及容许误差 ,编制牛顿法解方程f (x )=0的通用 程序. 解:Matlab 程序如下: 函数m 文件:fu.m function Fu=fu(x) Fu=x^3/3-x; end 函数m 文件:dfu.m function Fu=dfu(x) Fu=x^2-1; end 用Newton 法求根的通用程序Newton.m clear; x0=input('请输入初值x0:'); ep=input('请输入容许误差:'); flag=1; while flag==1 x1=x0-fu(x0)/dfu(x0); if abs(x1-x0)

while flag1==1 && m<=10^3 x1=x0-fu(x0)/dfu(x0); if abs(x1-x0)=ep flag=0; end end fprintf('最大的sigma 值为:%f\n',sigma); 2.求下列方程的非零根 5130.6651()ln 05130.665114000.0918 x x f x x +?? =- = ?-???解:Matlab 程序为: (1)主程序 clear clc format long x0=765; N=100; errorlim=10^(-5); x=x0-f(x0)/subs(df(),x0); n=1; while nerrorlim n=n+1; else break ; end x0=x; end disp(['迭代次数: n=',num2str(n)]) disp(['所求非零根: 正根x1=',num2str(x),' 负根x2=',num2str(-x)]) (2)子函数 非线性函数f function y=f(x) y=log((513+0.6651*x)/(513-0.6651*x))-x/(1400*0.0918); end

哈尔滨工程大学数值分析大作业2014-附fortran程序

B班大作业要求: 1. 使用统一封皮; 2. 上交大作业内容包含: 一摘要 二数学原理 三程序设计(必须对输入变量、输出变量进行说明;编程无语言要求,但程序要求通过)四结果分析和讨论 五完成题目的体会与收获 3. 提交大作业的时间:本学期最后一次课,或考前答疑;过期不计入成绩; 4. 提交方式:打印版一份;或手写大作业,但必须使用A4纸。 5. 撰写的程序需打印出来作为附录。

课程设计 课程名称: 设计题目: 学号: 姓名: 完成时间:

题目一:非线性方程求根 一 摘要 非线性方程的解析解通常很难给出,因此非线性方程的数值解就尤为重要。本实验通过使用常用的求解方法二分法和Newton 法及改进的Newton 法处理几个题目,分析并总结不同方法处理问题的优缺点。观察迭代次数,收敛速度及初值选取对迭代的影响。 用Newton 法计算下列方程 (1) 310x x --= , 初值分别为01x =,00.45x =,00.65x =; (2) 32943892940x x x +-+= 其三个根分别为1,3,98-。当选择初值02x =时给出结果并分析现 象,当6 510ε-=?,迭代停止。 二 数学原理 对于方程f(x)=0,如果f(x)是线性函数,则它的求根是很容易的。牛顿迭代法实质上是一种线性化方法,其基本思想是将非线性方程f(x)=0逐步归结为某种线性方程来求解。 设已知方程f(x)=0有近似根x k (假定k f'(x )0≠) ,将函数f(x)在点x k 进行泰勒展开,有 k k k f(x)f(x )+f'(x )(x-x )+≈??? 于是方程f(x)=0可近似的表示为 k k k f(x )+f'(x )(x-x )=0 这是个线性方程,记其根为x k+1,则x k+1的计算公式为 k+1k () x =x -'() k k f x f x ,k=0,1,2,… 这就是牛顿迭代法或简称牛顿法。

北航数值分析报告大作业第八题

北京航空航天大学 数值分析大作业八 学院名称自动化 专业方向控制工程 学号 学生姓名许阳 教师孙玉泉 日期2014 年11月26 日

一.题目 关于x , y , t , u , v , w 的方程组(A.3) ???? ?? ?=-+++=-+++=-+++=-+++79 .0sin 5.074.3cos 5.007.1cos sin 5.067.2cos 5.0y w v u t x w v u t y w v u t x w v u t (A.3) 以及关于z , t , u 的二维数表(见表A-1)确定了一个二元函数z =f (x , y )。 表A-1 二维数表 t z u 0 0.4 0.8 1.2 1.6 2 0 -0.5 -0.34 0.14 0.94 2.06 3.5 0.2 -0.42 -0.5 -0.26 0.3 1.18 2.38 0.4 -0.18 -0.5 -0.5 -0.18 0.46 1.42 0.6 0.22 -0.34 -0.58 -0.5 -0.1 0.62 0.8 0.78 -0.02 -0.5 -0.66 -0.5 -0.02 1.0 1.5 0.46 -0.26 -0.66 -0.74 -0.5 1. 试用数值方法求出f (x , y ) 在区域}5.15.0,8.00|), {≤≤≤≤=y x y x D (上的近似表达式 ∑∑===k i k j s r rs y x c y x p 00 ),( 要求p (x , y )以最小的k 值达到以下的精度 ∑∑==-≤-=10020 7210)],(),([i j i i i i y x p y x f σ 其中j y i x i i 05.05.0,08.0+==。 2. 计算),(),,(* ***j i j i y x p y x f (i =1,2,…,8 ; j =1,2,…,5) 的值,以观察p (x , y ) 逼 近f (x , y )的效果,其中j y i x j i 2.05.0,1.0**+==。

北航数值分析第二次大作业--QR分解

《数值分析A》

一、算法设计方案 整个程序主要分为四个函数,主函数,拟上三角化函数,QR分解函数以及使用双步位移求解矩阵特征值、特征向量的函数。因为在最后一个函数中也存在QR分解,所以我没有采用参考书上把矩阵M进行的QR分解与矩阵Ak的迭代合并的方法,而是在该函数中调用了QR分解函数,这样增强了代码的复用性,减少了程序长度;但由于时间关系,对阵中方法的运算速度没有进行深入研究。 1.为了减少QR分解法应用时的迭代次数,首先对给定矩阵进行拟上三角化处理。 2.对经过拟上三角化处理的矩阵进行QR分解。 3.注意到计算特征值与特征向量的过程首先要应用前面两个函数,于是在拟上三角化矩阵的基础上对QR分解函数进行了调用。计算过程中,没有采用goto语句,而是根据流程图采用其他循环方式完成了设计,通过对迭代过程的合并,简化了程序的循环次数,最后在计算特征向量的时候采用了列主元高斯消去法。

二、源程序代码 #include #include #include int i,j,k,l,m; //定义外部变量double d,h,b,c,t,s; double A[10][10],AA[10][10],R[10][10],Q[10][10],RQ[10][10]; double X[10][10],Y[10][10],Qt[10][10],M[10][10]; double U[10],P[10],T[10],W[10],Re[10]={0},Im[10]={0}; double epsilon=1e-12; void main() { void Quasiuppertriangular(double A[][10]); void QRdecomposition(double A[][10]); void DoublestepsQR(double A[][10]); int i,j; for(i=0;i<10;i++) { for(j=0;j<10;j++) { A[i][j]=sin(0.5*(i+1)+0.2*(j+1)); Q[i][j]=0; AA[i][j]=A[i][j]; } A[i][i]=1.5*cos(2.2*(i+1)); AA[i][i]=A[i][i];

数值计算大作业

数值计算大作业 题目一、非线性方程求根 1.题目 假设人口随时间和当时人口数目成比例连续增长,在此假设下人口在短期内的增长建立数学模型。 (1)如果令()N t 表示在t 时刻的人口数目,β 表示固定的人口出生率,则人口数目满足微分方程() ()dN t N t dt β=,此方程的解为0()=t N t N e β; (2)如果允许移民移入且速率为恒定的v ,则微分方程变成() ()dN t N t v dt β=+, 此方程的解为 0()=+ (1) t t v N t N e e βββ -; 假设某地区初始有1000000人,在第一年有435000人移入,又假设在第一年年底该地区人口数量1564000人,试通过下面的方程确定人口出生率β,精确到 410-;且通过这个数值来预测第二年年末的人口数,假设移民速度v 保持不变。 435000 1564000=1000000(1) e e βββ + - 2.数学原理 采用牛顿迭代法,牛顿迭代法的数学原理是,对于方程0)(=x f ,如果) (x f 是线性函数,则它的求根是很容易的,牛顿迭代法实质上是一种线性化方法,其基本思想是将非线性方程0)(=x f 逐步归结为某种线性方程来求解。 设已知方程0)(=x f 有近似根k x (假定0)(≠'x f ),将函数)(x f 在点k x 进行泰勒展开,有 . ))(()()(???+-'+≈k k k x x x f x f x f 于是方程0)(=x f 可近似地表示为 ))(()(=-'+k k x x x f x f 这是个线性方程,记其根为1k x +,则1k x +的计算公式为

数值分析作业答案.doc

第2章 插值法 1、当x=1,-1,2时,f(x)=0,-3,4,求f(x)的二次插值多项式。 (1)用单项式基底。 (2)用Lagrange 插值基底。 (3)用Newton 基底。 证明三种方法得到的多项式是相同的。 解:(1)用单项式基底 设多项式为:2 210)(x a x a a x P ++=, 所以:64 211111 1111122 2 211 200 -=-==x x x x x x A 3 76144 211111114241 13110111)() ()(22 221120 022 2 22 11 120 00-=-= ---==x x x x x x x x x f x x x f x x x f a 2 3694211111114411 31101111)(1)(1 )(122 221120 02 2 22112 001=--= --==x x x x x x x x f x x f x x f a 6 5654 2 1 1111114 2 1 3 11011111) (1)(1)(122 2 21120 022 11 00 2=--= ---==x x x x x x x f x x f x x f x a 所以f(x)的二次插值多项式为:26 52337)(x x x P ++-= (2)用Lagrange 插值基底 )21)(11() 2)(1())(())(()(2010210-+-+=----=x x x x x x x x x x x l )21)(11() 2)(1())(())(()(2101201------=----=x x x x x x x x x x x l ) 12)(12() 1)(1())(())(()(1202102+-+-=----= x x x x x x x x x x x l

数值分析大作业三四五六七完整版

数值分析大作业三四五 六七 HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】

大 作 业 三 1. 给定初值 0x 及容许误差 ,编制牛顿法解方程f (x )=0的通用 程序. 解:Matlab 程序如下: 函数m 文件: function Fu=fu(x) Fu=x^3/3-x; end 函数m 文件: function Fu=dfu(x) Fu=x^2-1; end 用Newton 法求根的通用程序 clear; x0=input('请输入初值x0:'); ep=input('请输入容许误差:'); flag=1; while flag==1 x1=x0-fu(x0)/dfu(x0); if abs(x1-x0)

end m=m+1; x0=x1; end if flag1==1||abs(x0)>=ep flag=0; end end fprintf('最大的sigma 值为:%f\n',sigma); 2.求下列方程的非零根 5130.6651()ln 05130.665114000.0918 x x f x x +?? =- = ?-???解:Matlab 程序为: (1)主程序 clear clc format long x0=765; N=100; errorlim=10^(-5); x=x0-f(x0)/subs(df(),x0); n=1; while nerrorlim n=n+1; else break ; end x0=x; end disp(['迭代次数: n=',num2str(n)]) disp(['所求非零根: 正根x1=',num2str(x),' 负根x2=',num2str(-x)]) (2)子函数 非线性函数f function y=f(x) y=log((513+*x)/*x))-x/(1400*; end (3)子函数 非线性函数的一阶导数df function y=df() syms x1 y=log((513+*x1)/*x1))-x1/(1400*; y=diff(y);

相关文档
最新文档