当前位置:文档之家› 非线性方程的数值计算方法实验

非线性方程的数值计算方法实验

非线性方程的数值计算方法实验
非线性方程的数值计算方法实验

非线性方程的数值计算方法实验

【摘要】在利用数学工具研究社会现象和自然现象,或解决工程技术等问题

时,很多问题都可以归结为非线性方程0x f =)(的求解问题,无论在理论研究方

面还是在实际应用中,求解非线性方程都占了非常重要的地位。综合当前各类非线性方程的数值解法,通过比较分析,二分法,迭代法,牛顿—拉夫森方法,迭代法的收敛阶和加速收敛方法,以上的算法应用对某个具体实际问题选择相应的数值解法。

关 键 词 非线性方程;二分法;迭代法;牛顿-拉夫森法;割线法等。

一、实验目的

通过本实验的学习,应掌握非线性方程的数值解法的基本思想和原理,深刻认识现实中非线性方程数值的意义;明确代数精度的概念;掌握二分法、不动点迭代法、牛顿迭代法、割线法等常用的解非线性方程的方法;培养编程与上机调试能力。

二、实验原理

二分法:单变量函数方程: f (x )=0

其中,f(x)在闭区间[a ,b]上连续、单调,且f(a)*f(b)<0,则有函数的介值定理可知,方程f (x )=0在(a ,b )区间内有且只有一个解*x ,二分法是通过函数在区间端点的符号来确定*x 所在区域,将有根区间缩小到充分小,从而可以求出满足给定精度的根*x 的近似值。 下面研究二分法的几何意义:

设1a =1, 1b =b, 区间[]11,b a ,中点1x =

2

1

1b a +及()1x f ,若()1x f =0,则*x =1x ,若 f(1a )*f(1x )<0,令2a =1a ,2b =1x ,则根*x ∈ [2a ,2b ]中,这样就得到长度缩小一半的有根区间[2a ,2b ],若 f(1b )*f(1x )<0,令2a =1x ,2b =1b ,则根*x ∈ [2a ,2b ]中,这样就得到长度缩小一半的有根区间[2a ,2b ],即f(2a )f(2b )<0,此时2b -2a =

2

1

1a b -,对有根区间[2a ,2b ]重复上述步骤,即分半求中点,判断中电处符号,则可得长度有缩小一半的有根区间[2a ,2b ],

如图所示:

重复上述过程,第n 步就得到根*x 的近似序列{}n x 及包含*x 的区间套,如下: (1)...],....[],[],[2211???n n b a b a b a (2)],[,0)()(*n n n n b a x b f a f ∈< (3)n a -n b =)(1121---n n b a =…=1

2--n a

b (4) ,2n n n b a x +=

且|*x -n x |≤12

--n a

b (n=1,2,3…..) 显然lim n x ,且n x 以等比数列的收敛速度收敛于*x ,因此用二分法求f (x )=0的实根*x 可以达到任意指定精度。

(二)迭代法:对给定的方程,将它转达换成等价形式:

给定初值

,由此来构造迭代序列

,如果迭代法收敛,即

,有

,则

就是方程

的根。在计算中当

小于给定的精度控制量时,取为方程的根。

(三)牛顿迭代法:设方程f(x)=0在其根*x 的某个领域U(*x ,δ)内有一阶连续导数,且f ’(*x ) ≠0。求f(x)=0的根*x ,首先要将f(x)=0转化为等价形式()x x ?=,并使? (x)满足不动点迭代的一般理论。

于是我们令? (x)=x+h(x)f(x),可由? ‘(1x )=0来确定h(x)的结构,根据?’(x)=1+h ’(*x )f(*x )+h(*x )f ’(x1)=1+h(*x )f ’(*x )=0可得

h(*x )=-1/f ’(*x ) ,由于f ’(x) ≠0,且f ’(x) 连续,因此当h(x)=-1/f ’(x) 时, h ’(x1)=0,即令? (x)=x-f(x)/f ‘(x), 从而有迭代格式 1+k x = )

(')

(k k k x f x f x -

(k=0,1,2,…..) 由于1x , 2x , 3x …….都在U 领域里,从而当B 比较小时,可用f ’(0x )可近似代替f ’(k x ),1+k x = k x - )

()

(0x f x f k ,此方法称为牛顿迭代法。

(四)割线法:设k x ,1-k x 为方程f(x)=0的两个近似根。用差商得:f(k x )-f(1-k x )/

k x - 1-k x ,代替牛顿迭代公式中的导数f’(k x ),于是得到如下的迭代公式: 1+k x =k x -)()

()()

(11----k k k k k x x x f x f x f 。

下面研究割线法的几何意义:

经过点(k x ,f(k x ))及点(1-k x ,f(1-k x ))两点作割线,其点斜式方程为: Y=f (k x )-

)()()(11k k k k k x x x x x f x f -----,其零点为X=k x - )

()

()()

(11----k k k k k x x x f x f x f 把X 用1+k x 表示即得到迭代格式,需要两个初值此割线与 X 轴交点的横坐标就是新的近似值1-k x ,如图所示。

三、实验内容

(一)、实验描述

1.P40.1:参照程序

2.1求解出单调收敛的不动点。

2.P49.1:已知初值,时间和末值,求解汇率。 4.P69.1:已知运动方程求解运动时间和距离。

(二)、实验题目

1.使用程序

2.1求解下面每个函数的不动点(尽肯能多)近似值,答案精确到 小数点后12位。同时,构造每个函数的图和直线y=x 来显示所有不动点。

(d)cos()()x x g x x -=

2.如果在240个月内每月付款300美元,求解满足全部现金A 为500000美元的 汇率I 的近似值(精确到小数点后10位)。

4.设投射方的运动程为

/15/15

()9600(1)480()2400(1)

t t y f t e t x r t e

--==--==-

(a ) 求当撞击地面时经过的时间,精确到小数点后10位。

(b)求水平飞行行程,精确到小数点后10位。

四、实验结果及分析

1. P40.1(d):

算法:

(1)输入函数g,p0,tol,max1,令k=2。

(2)判断k>max1是否成立,如成立输出结果,如不成立,执行(3)。

(3)令p(k)=g(p(k-1)),err=|p(k)-p(k-1)|。

(4)判断err

到(2)。

star

Input

g,p0,tol;k=2

k>max1

Let

p(k)=g(p(k-1));err=|p(k)-p(k-

1)|

err

output

end

output Y

N

k=k+1

N Y

令cos()()x x g x x -=,简单画出cos()()x x g x x -=与y x =的图像,可令x=1,12110tol -=?,max1100=。

-2

-1.5-1-0.50

0.51 1.52 2.5

-25-20-15-10-505

1015

20x

x .(x -c o s (x )) y =x

图4. cos()()x x g x x -=与y x =

当输入[k,p,err,P]=fixpt(g,1,1e-12,100) 输出k =2 p =1 err =0 P =

1 1

通过图形我们知道不动点有2个,X=1是吸引不动点.因而函数只有一个吸引迭代点。 2.P49.1 算法:

(1) 输入f,a,b,delta,max1,令k= 1。 (2) f(a)=feval(f,a);f(b)=feval(f,b);k=1.

(3)判断f(a)*f(b)>0是否成立,若不成立输出结果,若成立执行步骤(4)。 (4)判断k>max1是否成立,若成立输出结果,若不成立执行步骤(5)。

(5)令dx=yb*(b-a)/(yb-ya),c=b-x,yc=feval(f,c).

(6) 判断yc=0是否成立,若成立输出结果,若不成立执行步骤(7)。 (7)判断yc*yb>0是否成立,若成立,令b=c,yb=yc.若不成立,令a=c,ya=yc. ( 8)令err=|b-a|.

(9)判断err

流程图:

start

Input f,a,b,delta,max

f(a)*f(b)>

k>max1 dx=yb*(b-a)/(b-a )

c=b-x yc=0

yc*yb>0 a=c ya=yc

b=c yb=yc

err=|b-a|

err

output

end

output

Y

N Y

N

Y

N

N

Y Y N

k=k+1

当输入[c,err,yc]=regula(@f,0.15,0.16,1e-10,100)

输出c =0.157539310266284

err =-1.257285475730896e-008

yc =2.775557561562891e-017

4.P69.1

算法:

(1)输入h,r,p0,p1,delta,max1.令k=1.

(2)判断k>max1是否成立,若成立,输出;若不成立,执行(3)。(3)令

p2=p1-feval(f,p1)*(p1-p0)/(feval(f,p1)-feval(f,p0)),err1=|p1-

p0|,

err2=|feval(r,p1)-feval(r,p0)|,p0=p1,p1=p2

(4)判断err1

流程图:

start

Input

f,r,p0,p1,delta

max1 k=1

k>max1

P2=p1-feval(f,p1)*(p1-p0)/(feval(h,p

1)-feval(h,p0))

Err1=|p1-p0|

err2=|feval(r,p1)-feval(r,p0)|

C=feval(r,p1) p0=p1 p1=p2

Err2

rr2

output

end

输入[p1,err1,err2,k,c]=secant(@h,@r,9,9.5,1e-10,100)

输出p1 = 9.087899668785003

err1 =2.913225216616411e-013

err2 =2.523847797419876e-011

k = 6

c = 1.090547960254200e+003

五、实验结论

1.采用的不动点迭代法,只能计算出吸引不动点,不能算出排斥迭代点。

2.计算得所求的利率为0.157539310266285。

4. 计算得投射体撞击地面经过的时间p1 = 9.087899668785003

飞行行程c = 1.090547960254200e+003。

附件(代码):

1(d). plot the figure of x.^(x-cos(x)) with y=x

x=-2:0.05:2.4;

y=x;

g=x.^(x-cos(x));

plot(x,g,x,y)

xlabel('x');

ylabel('x.^(x-cos(x)) y=x');

%definite function g(x)

function b=g(x)

b=x.^(x-cos(x));

function [k,p,err,P]=fixpt(g,p0,tol,max1)

%input--g is iteratin function input as string 'g'

% -p0 is initial guess for the fixed point

% -tol is the tolerance

% -max1 is the maximum number of iterations

%output-k is the number of iteratins that were carried out % -p is approximation to the fixed point

% -err is the error in the approximation

% -P contains the sequence{pn}

P(1)=p0;

for k=2:max1

P(k)=feval(g,P(k-1));

err=abs(P(k)-P(k-1));

relerr=err/(abs(P(k))+eps);

p=P(k);

if (err

end

if k==max1

disp('maximum number of iterations exceeded') end

P=P';

2. %definite the function f(x)

function A=f(x)

p=300;

n=240;

A=12*p*((1+x/12)^n-1)/x-500000;

function [c,err,yc]=regula(f,a,b,delta,max1)

%input--f is the function input as a string 'f'

% -a and b are the left and right points

% -delta is the tolerance for the zero

% -max1 is the maximum number of iterations %output-c is the zero

% -yc=f(c)

% -err is the error estimate for c

ya=feval(f,a);

yb=feval(f,b);

if ya*yb>0

disp('ya,yb are not suitable ')

return

end

for k=1:max1

dx=yb*(b-a)/(yb-ya);

c=b-dx;

yc=feval(f,c);

if yc==0,break;

elseif yc*yb<0

a=c;ya=yc;

else

b=c;yb=yc;

end

err=abs(b-a);

if err

end

4.%definite function r(t)

function x=r(t)

x=2400*(1-exp(-t/15));

%definite function h(t)

function y=h(t)

y=9600*(1-exp(-t/15))-480*t;

function [p1,err1,err2,k,c]=secant(h,r,p0,p1,delta,max1)

%input--h is the function of altitude inpput as string 'h'

% --r is the function of path input as a string 'r'

% --p0 and p1 is the initial approximations to a zero % --delta is the tolerance for p1 and y

% --max1 is the maximum number of iterations

%output-p1 is the secant method approximation to the zero % -err1 is estimate for p1

% -err2 is estimate for y

% -k is the number of iterations

% -y is the function value r(p1)

for k=1:max1

p2=p1-feval(h,p1)*(p1-p0)/(feval(h,p1)-feval(h,p0));

err1=abs(p1-p0);

err2=abs(feval(r,p1)-feval(r,p0));

c=feval(r,p1);

p0=p1;

p1=p2;

if err1

end

陕西科技大学matlab实验1 解非线性方程实验

实验1 解非线性方程实验 成绩 实验类型:●验证性实验 ○综合性实验 ○设计性实验 实验目的:进一步熟练掌握解非线性方程二分法算 法、弦截法算法,提高编程能力和解算非线性方程问题的 实践技能。 实验内容:用二分法算法、牛顿迭代法,弦截法算法解算非线性方程,,计算=0的根 实验原理二分法算法 牛顿迭代法 弦截法算法 实验步骤 1 要求上机实验前先编写出程序代码 2 编辑录入程序 3 调试程序并记录调试过程中出现的问题及修改 程序的过程 4 经反复调试后,运行程序并验证程序运行是否 正确。 5 记录运行时的输入和输出。 实验总结 实验报告:根据实验情况和结果撰写并递交实验报告。 参考程序 一.二分法算法 1.建立二分法的函数文件bisect.m function [c,err,yc]=bisect(f,a,b,delta) %Iput - f is the function input as a string 'f'

% -a and b are the left and right end points % -delta is the tolerance %Output -c is the zero point % -yc=f(c) % -err is the error estimate for c ya=feval(f,a); yb=feval(f,b); if ya*yb > 0,return,end max1=1+round((log(b-a)-log(delta))/log(2)); for k=1:max1 c=(a+b)/2; yc=feval(f,c); if yc==0 a=c; b=c; elseif yb*yc>0 b=c; yb=yc; else a=c; ya=yc; end if b-a < delta,break,end end c=(a+b)/2; err=abs(b-a); yc=feval(f,c); 2.建立f(x)=x^2-5的matlab函数文件fff.m function y=fff(x); y=x.^2-5; 3.在命令窗口中准备调用bisect函数的实参 >> a=2; >> b=3; >> delta=0.0001; 4.在命令窗口中调用bisect函数 >> [x,err,yx]=bisect('fff',a,b,delta) x =

数值计算实验课题目

数值实验课试题 本次数值实验课结课作业,请按题目要求内容写一篇文章。按题目要求 人数自由组合,每组所选题目不得相同(有特别注明的题目除外)。试题如下: 1)解线性方程组的Gauss 消去法和列主元Gauss 消去法(2人)/*张思珍,巩艳华*/ 用C 语言将不选主元和列主元Gauss 消去法编写成通用的子程序,然后用你编写的程序求解下列84阶的方程组 ???? ?????? ? ??=??????????? ????????????? ? ?1415151515768 168 168 168 1681684 8382321 x x x x x x 参考书目: 1.《计算机数值方法》,施吉林、刘淑珍、陈桂芝编 2.《数值线性代数》,徐树方、高立、张平文编 3.《数值分析简明教程》,王能超编 2)解线性方程组的平方根法(4人)/*朱春成、黄锐奇、张重威、章杰*/ 用C 语言将平方根法和改进的平方根法编写成通用的子程序,然后用你编写的程序求解对称正定方程组b Ax =,其中 (1)b 随机的选取,系数矩阵为100阶矩阵 ?????? ???? ? ? ?101 1101 1101 1101 1101110 ; (2)系数矩阵为40阶的Hilbert 矩阵,即系数矩阵A 的第i 行第j 列元素为 1 1-+= j i a ij ,向量b 的第i 个分量为∑=-+ = n j i j i b 1 1 1. 参考书目: 1.《计算机数值方法》,施吉林、刘淑珍、陈桂芝编 2.《数值线性代数》,徐树方、高立、张平文编

3.《数值分析简明教程》,王能超编 3)三对角线方程组的追赶法(3人)/*黄佳礼、唐伟、韦锡倍*/ 用C 语言将三对角线方程组的追赶法法编写成通用的子程序,然后用你编写的程序求解如下84阶三对角线方程组 ???? ?????? ? ??=??????????? ????????????? ? ?1415151515768 168 168 168 16816 84 8382321 x x x x x x 参考书目: 1.《计算机数值方法》,施吉林、刘淑珍、陈桂芝编 2.《数值分析简明教程》,王能超编 4)线性方程组的Jacobi 迭代法(3人)/*周桂宇、杨飞、李文军*/ 用C 语言将Jacobi 迭代法编写成独立的子程序,并用此求解下列方程组, 精确到小数点后5位 ???? ? ??=????? ??????? ? ?-149012 2111221 3 2 1 x x x 参考书目: 1.《计算机数值方法》,施吉林、刘淑珍、陈桂芝编 2.《数值线性代数》,徐树方、高立、张平文编 3.《数值分析简明教程》,王能超编 5)线性方程组的Gauss-Seidel 迭代法(3人)/*张玉超、范守平、周红春*/ 用C 语言将Gauss-Seidel 迭代法编写成独立的子程序,并用此求解下列方程组,精确到小数点后5位 ???? ? ??=????? ??????? ? ?--39721 1111112 3 2 1 x x x 参考书目: 1.《计算机数值方法》,施吉林、刘淑珍、陈桂芝编 2.《数值线性代数》,徐树方、高立、张平文编 3.《数值分析简明教程》,王能超编 6)解线性方程组的最速下降法法(2人)/*赵育辉、阿热孜古丽*/ 用C 语言将最速下降法编写成通用的子程序,然后用你编写的程序求解对称

推荐-Broyden方法求解非线性方程组的Matlab实现 精品

Broyden方法求解非线性方程组的Matlab实现 注:matlab代码来自网络,仅供学习参考。 1.把以下代码复制在一个.m文件上 function [sol, it_hist, ierr] = brsola(x,f,tol, parms) % Broyden's Method solver, globally convergent % solver for f(x) = 0, Armijo rule, one vector storage % % This code es with no guarantee or warranty of any kind. % % function [sol, it_hist, ierr] = brsola(x,f,tol,parms) % % inputs: % initial iterate = x % function = f % tol = [atol, rtol] relative/absolute % error tolerances for the nonlinear iteration % parms = [maxit, maxdim] % maxit = maxmium number of nonlinear iterations % default = 40 % maxdim = maximum number of Broyden iterations % before restart, so maxdim-1 vectors are % stored % default = 40 % % output: % sol = solution % it_hist(maxit,3) = scaled l2 norms of nonlinear residuals % for the iteration, number function evaluations, % and number of steplength reductions % ierr = 0 upon successful termination % ierr = 1 if after maxit iterations % the termination criterion is not satsified. % ierr = 2 failure in the line search. The iteration % is terminated if too many steplength reductions % are taken. % % % internal parameter: % debug = turns on/off iteration statistics display as % the iteration progresses

数值计算方法课程报告

课程报告 课程名称______《数值计算》 __ 学生学院_____机电工程学院___ 专业班级_____微电子(1)班____ 学号________ 学生姓名_______________ 指导教师_____ ________ XXXX年XX月XX日

姓 名: 线 学 号 : 订 装专 业:学院: 广东工业大学考试试卷( A ) 课程名称: 数值计算试卷满分100 分考试时间: 2015 年 12 月 26 日(第 17 周星期六) 题号一二三四五六七八九十总分 评卷得分 评卷签名 复核得分 复核签名 “数值计算”考试要求 “数值计算”考试以开卷形式进行。在“数值计算”课程考试日(2015 年12 月 19 日,第 12 周星期五)考试时间,在考试教室领取试题,在 2015 年12 月 26 日(第 17 周星期六)进行答辩。不参加答辩者将取消考试成绩。 “数值计算”考试结果要求独立在计算机上完成,可使用Matlab或 C 程序编程实现。考试结果将以报告书形式提交,内容包括对问题描述、计算程序以及算例、计算结果、分析组成。计算程序要求具有通用性,能够处理异常情况,可以输入问题、算法参数、算例及初始值,在计算过程中显示当前计算状态、计算完成后显示计算结果。上述内容将作为试卷成绩的主要评定依据。特别提醒,不得使用教师在讲课和实验时的范例作为考试结果。报告书具体格式参考毕业设计手册。 以考生学号命名的文件夹存放程序及报告书电子版,以班级为单位刻录在一张光盘中,与打印版报告书一起由班长和学习委员一起上交任课教师。 数值计算课程总成绩将由试卷成绩(70%)、平时成绩(30%)组成。

matlab实验一:非线性方程求解-牛顿法

实验一:非线性方程求解 程序1:二分法: syms f x; f=input('请输入f(x)='); A=input('请输入根的估计范围[a,b]='); e=input('请输入根的误差限e='); while (A(2)-A(1))>e c=(A(1)+A(2))/2; x=A(1); f1=eval(f); x=c; f2=eval(f); if (f1*f2)>0 A(1)=c; else A(2)=c; end end c=(A(1)+A(2))/2; fprintf('c=%.6f\na=%.6f\nb=%.6f\n',c,A) 用二分法计算方程: 1.请输入f(x)=sin(x)-x^2/2 请输入根的估计范围[a,b]=[1,2] 请输入根的误差限e=0.5e-005 c=1.404413 a=1.404411 b=1.404415 2.请输入f(x)=x^3-x-1 请输入根的估计范围[a,b]=[1,1.5] 请输入根的误差限e=0.5e-005 c=1.324717 a=1.324715 b=1.324718 程序2:newton法: syms f x; f=input('请输入f(x)='); df=diff(f); x0=input('请输入迭代初值x0='); e1=input('请输入奇异判断e1='); e2=input('请输入根的误差限e2='); N=input('请输入迭代次数限N='); k=1; while (k=N fprintf('失败\n') end 用newton法计算方程: 1.请输入f(x)=x*exp(x)-1 请输入迭代初值x0=0.5 请输入奇异判断e1=0.1e-010 请输入根的误差限e2=0.5e-005 请输入迭代次数限N=10 x=0.567143 迭代次数为:4 2.请输入f(x)=x^3-x-1 请输入迭代初值x0=1 请输入奇异判断e1=0.1e-010 请输入根的误差限e2=0.5e-005

曲线拟合的数值计算方法实验

曲线拟合的数值计算方法实验 【摘要】实际工作中,变量间未必都有线性关系,如服药后血药浓度与时间的关系;疾病疗效与疗程长短的关系;毒物剂量与致死率的关系等常呈曲线关系。曲线拟合(curve fitting)是指选择适当的曲线类型来拟合观测数据,并用拟合的曲线方程分析两变量间的关系。曲线直线化是曲线拟合的重要手段之一。对于某些非线性的资料可以通过简单的变量变换使之直线化,这样就可以按最小二乘法原理求出变换后变量的直线方程,在实际工作中常利用此直线方程绘制资料的标准工作曲线,同时根据需要可将此直线方程还原为曲线方程,实现对资料的曲线拟合。常用的曲线拟合有最小二乘法拟合、幂函数拟合、对数函数拟合、线性插值、三次样条插值、端点约束。 关键词曲线拟合、最小二乘法拟合、幂函数拟合、对数函数拟合、线性插值、三次样条插值、端点约束 一、实验目的 1.掌握曲线拟合方式及其常用函数指数函数、幂函数、对数函数的拟合。 2.掌握最小二乘法、线性插值、三次样条插值、端点约束等。 3.掌握实现曲线拟合的编程技巧。 二、实验原理 1.曲线拟合 曲线拟合是平面上离散点组所表示的坐标之间的函数关系的一种数据处理方法。用解析表达式逼近离散数据的一种方法。在科学实验或社会活动中,通过 实验或观测得到量x与y的一组数据对(X i ,Y i )(i=1,2,...m),其中各X i 是彼此不同的。人们希望用一类与数据的背景材料规律相适应的解析表达式,y=f(x,c)来反映量x与y之间的依赖关系,即在一定意义下“最佳”地逼近或 拟合已知数据。f(x,c)常称作拟合模型,式中c=(c 1,c 2 ,…c n )是一些待定参 数。当c在f中线性出现时,称为线性模型,否则称为非线性模型。有许多衡量拟合优度的标准,最常用的一种做法是选择参数c使得拟合模型与实际观测值在

太原理工大学数值计算方法实验报告

本科实验报告 课程名称:计算机数值方法 实验项目:方程求根、线性方程组的直接解 法、线性方程组的迭代解法、代数插值和最 小二乘拟合多项式 实验地点:行勉楼 专业班级: ******** 学号: ********* 学生姓名: ******** 指导教师:李誌,崔冬华 2016年 4 月 8 日

y = x*x*x + 4 * x*x - 10; return y; } float Calculate(float a,float b) { c = (a + b) / 2; n++; if (GetY(c) == 0 || ((b - a) / 2) < 0.000005) { cout << c <<"为方程的解"<< endl; return 0; } if (GetY(a)*GetY(c) < 0) { return Calculate(a,c); } if (GetY(c)*GetY(b)< 0) { return Calculate(c,b); } } }; int main() { cout << "方程组为:f(x)=x^3+4x^2-10=0" << endl; float a, b; Text text; text.Getab(); a = text.a; b = text.b; text.Calculate(a, b); return 0; } 2.割线法: // 方程求根(割线法).cpp : 定义控制台应用程序的入口点。// #include "stdafx.h" #include"iostream"

心得体会 使用不同的方法,可以不同程度的求得方程的解,通过二分法计算的程序实现更加了解二分法的特点,二分法过程简单,程序容易实现,但该方法收敛比较慢一般用于求根的初始近似值,不同的方法速度不同。面对一个复杂的问题,要学会简化处理步骤,分步骤一点一点的循序处理,只有这样,才能高效的解决一个复杂问题。

数值分析实验报告1

实验一误差分析 实验1.1(病态问题) 实验目的:算法有“优”与“劣”之分,问题也有“好”与“坏”之别。对数值方法的研究而言,所谓坏问题就是问题本身对扰动敏感者,反之属于好问题。通过本实验可获得一个初步体会。 数值分析的大部分研究课题中,如线性代数方程组、矩阵特征值问题、非线性方程及方程组等都存在病态的问题。病态问题要通过研究和构造特殊的算法来解决,当然一般要付出一些代价(如耗用更多的机器时间、占用更多的存储空间等)。 问题提出:考虑一个高次的代数多项式 显然该多项式的全部根为1,2,…,20共计20个,且每个根都是单重的。现考虑该多项式的一个扰动 其中ε(1.1)和(1.221,,,a a 的输出b ”和“poly ε。 (1(2 (3)写成展 关于α solve 来提高解的精确度,这需要用到将多项式转换为符号多项式的函数poly2sym,函数的具体使用方法可参考Matlab 的帮助。 实验过程: 程序: a=poly(1:20); rr=roots(a); forn=2:21 n form=1:9 ess=10^(-6-m);

ve=zeros(1,21); ve(n)=ess; r=roots(a+ve); -6-m s=max(abs(r-rr)) end end 利用符号函数:(思考题一)a=poly(1:20); y=poly2sym(a); rr=solve(y) n

很容易的得出对一个多次的代数多项式的其中某一项进行很小的扰动,对其多项式的根会有一定的扰动的,所以对于这类病态问题可以借助于MATLAB来进行问题的分析。 学号:06450210 姓名:万轩 实验二插值法

用割线法解非线性方程组

用割线法解非线性方程组 自动化学院1011203050 陈晓祺拟牛顿法解下列方程组 sin 1.0 cos 5.00 ) cos( 1.0 sin 5.0 2 2 11 2 1 1 = - -= -+ x x x x x x x 先将拟牛顿法的程序代码如下 Function[r,m]=mulVlineF,x0,A, eps) Format long; If nargin=3 Eps=1e-4; End X0=transpose(x0); X1=tanspose(x1); N=length(x0); Fx=subs(F,findsym(F),x0); Fx1=subs(F,findsym(F),x1); H=x0-x1; J=zeros(n,n); Xt=x1; Xt(1)=x0(1); J(:,1)=(subs(F,findsym(F),xt)-sbus(F,findsym(F),x1))/h(1); For i=2:n Xt=x1; Xt(1:i)=x0(1:i); Xt_m=xl; Xt_m(1:i-1)=x0(1:i-1); J(:,i)=(subs(F,findsym(F),xt)-sbus(F,findsym(F),xt_m))/h(1); End R=x1-inv(J)*fx1; M=1; Tol=1; While tol>eps X0=x1; X1=r; Fx=subs(F,findsym(F),x0); Fx1=subs(F,findsym(F),x1); H=x0-x1;

J=zeros(n,n); Xt=x1; Xt(1)=x0(1); J(:,1)=(subs(F,findsym(F),xt)-subs(F,findsym(F),x1))/h(1); For i=2:n Xt=x1; Xt(1:i)=x0(1:i); Xt_m=x1; Xt_m(1:i-1)x0(1:i-1); J(:,1)=(subs(F,findsym(F),xt)-subs(F,findsym(F),xt_m))/h(1); End R=x1-inv(J)*fx1; Tol=norm(r-x1); M=m+1; If(m>100000) Disp('fail'); Return; End End 然后直接调用该方法 Syms x y Z=[x^2+y^2-5;2*x-y-3]; [r,m]=mulline(z,[0 1],[4,3]) [r,m]=mulline(z,[-3 1],[4,3]) 得到解为(2,1)(0.4,-2.2)

数值计算方法学习心得

数值计算方法学习心得 ------一个代码的方法是很重要,一个算法的思想也很重要,但 在我看来,更重要的是解决问题的方法,就像爱因斯坦说的内容比 思维本身更重要。 我上去讲的那次其实做了挺充分的准备,程序的运行,pdf文档,算法公式的推导,程序伪代码,不过有一点缺陷的地方,很多细节 没有讲的很清楚吧,下来之后也是更清楚了这个问题。 然后一学期下来,总的来说,看其他同学的分享,我也学习到 许多东西,并非只是代码的方法,更多的是章胜同学的口才,攀忠 的排版,小冯的深入挖掘…都是对我而言比算法更加值得珍惜的东西,又骄傲地回想一下,曾同为一个项目组的我们也更加感到做项 目对自己发展的巨大帮助了。 同时从这些次的实验中我发现以前学到的很多知识都非常有用。 比如说,以前做项目的时候,项目导师一直要求对于要上传的 文件尽量用pdf格式,不管是ppt还是文档,这便算是对产权的一种 保护。 再比如代码分享,最基础的要求便是——其他人拿到你的代码 也能运行出来,其次是代码分享的规范性,像我们可以用轻量级Ubuntu Pastebin,以前做过一小段时间acm,集训队里对于代码的分享都是推荐用这个,像数值计算实验我觉得用这个也差不多了,其 次项目级代码还是推荐github(被微软收购了),它的又是可能更 多在于个人代码平台的搭建,当然像readme文档及必要的一些数据 集放在上面都更方便一些。

然后在实验中,发现debug能力的重要性,对于代码错误点的 正确分析,以及一些与他人交流的“正规”途径,讨论算法可能出 错的地方以及要注意的细节等,比如acm比赛都是以三人为一小组,讨论过后,讲了一遍会发现自己对算法理解更加深刻。 然后学习算法,做项目做算法一般的正常流程是看论文,尽量 看英文文献,一般就是第一手资料,然后根据论文对算法的描述, 就是如同课上的流程一样,对算法进一步理解,然后进行复现,最 后就是尝试自己改进。比如知网查询牛顿法相关论文,会找到大量 可以参考的文献。 最后的最后,想说一下,计算机专业的同学看这个数值分析, 不一定行云流水,但肯定不至于看不懂写不出来,所以我们还是要 提高自己的核心竞争力,就是利用我们的优势,对于这种算法方面 的编程,至少比他们用的更加熟练,至少面对一个问题,我们能思 考出对应问题的最佳算法是哪一个更合适解决问题。 附记: 对课程的一些小建议: 1. debug的能力不容忽视,比如给一个关于代码实现已知错误的代码给同学们,让同学们自己思考一下,然后分享各自的debug方法,一步一步的去修改代码,最后集全班的力量完成代码的debug,这往往更能提升同学们的代码能力。 2. 课堂上的效率其实是有点低的,可能会给学生带来一些负反馈,降低学习热情。 3. 总的来说还是从这门课程中学到许多东西。 数值分析学习心得体会

实验报告二 一元非线性方程的解法..

浙江大学城市学院实验报告 课程名称 科学计算 实验项目名称 一元非线性方程的解法 实验成绩 指导老师(签名 ) 日期 2013/10/10 一. 实验目的和要求 1. 用Matlab 软件掌握求解非线性方程的二分法、迭代法和牛顿法,并对结果作初步分析; 2. 通过实例练习用非线性方程求解实际问题。 二. 实验内容和原理 分析应用题2-1,2-2,2-3,2-4,2-5要求将问题的分析过程、Matlab 源程序和运行结果和结果的解释、算法的分析写在实验报告上。 2-1 程序注释 对用二分法、迭代法和牛顿法求一元非线性方程数值解的Matlab 程序的每一句添上注释。 二分法: [x,n]=BisectionMethod(a,b,epsi,Nmax) 迭代法: [x,n]=IterationMethod(x0,epsi,Nmax) Newton 法: [x,n]=NewtonMethod(x0,epsi,Nmax) 2-2 分析应用题 用二分法求方程2 ()sin 04 x f x x =-=和()sin 0x g x e x =-=根的近似值,使误差不超过210-,输出每次二分之后解的近似结果以及二分的次数,其中()0g x =的根只需求最接近 原点的那个根。 2-3 分析应用题 已知方程230x x e -=有以下三种迭代格式,分析三种迭代格式的收敛性,求出迭代精度为610-的数值结果,并比较迭代序列的收敛速度。

1 )1n x += 2)12ln ln3n n x x +=+ 3)136n n x n n n x n x e x x x e +-=-- 2-4 分析应用题 用下列方法求方程1020x e x +-=的近似根,要求误差不超过31102-?,并比较计算量。 1)在区间[0, 1]上用二分法; 2)取初值0x =,并用迭代过程 12(0,1,2,.......) 10 k x k e x k +-==; 3)取初值00x =用牛顿法求解。 2-5 分析应用题 以定期存储为基础的储蓄帐户的累积值可由定期年金方程确定 [(1)1]n P A i i =+- 在这个方程中,A 是帐户中的数额,P 是定期存储的数额,i 是n 个存储期间的每期利率。一个工程师想在20年后退休时储蓄帐户上的数额达到750000美元,而为了达到这个目标,他每个月能存1500美元。为实现他的储值目标,最小利率应是多少?假定利息是月复利的。 三. 操作方法与实验步骤(包括实验数据记录和处理) 2-1 分析应用题 对用二分法、迭代法和牛顿法求一元非线性方程数值解的Matlab 程序的每一句添上注释。 二分法: [x,n]=BisectionMethod(a,b,epsi,Nmax) Function[c,err,yc]=erfen(f,a,b,delta) Ya=feval(f,a); Yb=feval(f,b); If ya*yb>0,break,end Maxl=1+round((log(b-a)-log(delta))/log(2)); For k=1:max1 C=(a+b)/2; Yc=feval(f,c); If yc = 0 a=c; b=c;

Maab求解线性方程组非线性方程组

M a a b求解线性方程组非 线性方程组 The latest revision on November 22, 2020

求解线性方程组solve,linsolve例:A=[5 0 4 2;1 -1 2 1;4 1 2 0;1 1 1 1];%矩阵的行之间用分号隔开,元素之间用逗号或空格B=[3;1;1;0]X=zeros(4,1);%建立一个4元列向量 X=linsolve(A,B)diff(fun,var,n):对表达式fun中的变量var求n阶导数。 例如:F=sym('u(x,y)*v(x,y)'); %sym()用来定义一个符号表达式diff(F); %matlab区分大小写pretty(ans) %pretty():用习惯书写方式显示变量;ans是答案表达式 非线性方程求解 fsolve(fun,x0,options) 其中fun为待解方程或方程组的文件名; x0位求解方程的初始向量或矩阵; option为设置命令参数 建立文件: function y=fun(x) y=[x(1)*sin(x(1))*cos(x(2)), ... x(2) - *cos(x(1))+*sin(x(2))]; >>clear;x0=[,];fsolve(@fun,x0,optimset('fsolve'))注:...为续行符m文件必须以function 为文件头,调用符为@;文件名必须与定义的函数名相同;fsolve()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程。 Matlab求解线性方程组AX=B或XA=B在MATLAB中,求解线性方程组时,主要采用前面章节介绍的除法运算符“/”和“\”。如:X=A\B表示求矩阵方程AX=B的解;X=B/A表示矩阵方程XA=B 的解。对方程组X=A\B,要求A和B用相同的行数,X和B有相同的列数,它的行数等于矩阵A 的列数,方程X=B/A同理。 如果矩阵A不是方阵,其维数是m×n,则有:m=n 恰定方程,求解精确解;m>n 超定方程,寻求最小二乘解;m

求解非线性方程实验报告

一.实验目的: 通过本节实验课的学习,要求我们理解并掌握二分法、不动点迭代、牛顿切线法及弦截法解非线性方程求根的原理,掌握相应的算法原理,通过计算机解决实验问题 二.实验内容: 1、用对分区间法方程 1-x-sinx=0 在区间[0,1]上的误差小于10^(-4)的一个根,并记录对方区间的次数。 2、用不动点迭代法求解方程下 x-log(x)=2(x>1) 要求相对误差容限e=10^(-8)。 3、用Newton法求方程 x^3-x-1=0 在区间[-3,3]上的误差不大于10^(-5)的根,分别取初值x0=1.5, x0=0, x0=-1进行计算,比较他们的迭代次数。 三. 实验方案(程序设计说明)[包括算法设计思路,必要的流程图,界面设计 说明、使用模块及变量的说明等。] 1、二分法是对区间收索法的一种改进,具体做法为:先求一区间的中点,并计算其 函数值,若恰好有函数值为0,就是方程的根,若不为0,在判断此点的函数值与两端的函数值乘积的情况,取小于0的那个端点在进行上述对分,直到满足要求为止。 2、迭代法分为两种,一种是从任何可取的初值出发都能保证收敛,称之为大范围收 敛的方法。另一类称之为局部收敛法,即为了保证收敛必须选取初值充分接近于所要求的解。迭代法的基本思想是一种逐渐逼近的方法,首先给定一个粗造的初值,然后用一个迭代公式,反复矫正这个初值,直到满足预先给出的精确要求为止。 3、双点弦接法与Newton法不同,两者有本质的区别,它分为两步,不属于不动点 迭代法。 四. 实验步骤或程序(经调试后正确的源程序) (填写主要步骤与程序代码等,不够可附页) 1、f=inline('x+sin(x)-1'); a=0; b=1; dlt=1.0e-4; k=1; while abs(b-a)>dlt c=(a+b)/2; if f(c)==0 break; elseif f(c)*f(b)<0 a=c;

数值计算方法实验5

实验报告 学院(系)名称: 主程序部分列选主元部分

实验结果: 一.列主元消去法 输入各个数据,最终使用列选主元法,得到结果为:x1=x2=x3=1二.高斯-赛德尔迭代法 输入各个数据,输出每一步迭代数据,最终结果为:x1=0.285716,附录(源程序及运行结果) 一.列主元高斯消去法 #include #include void print(double a[3][3],int n,double b[3]){ printf("输出矩阵:\n"); for(int i=0;ifabs(d)){ d=a[i][k]; l=i; } i++; } printf("选出主元:%lf\n",d); if(d==0) printf("矩阵奇异!\n"); else if(l!=k){ for(int j=k;j

Matlab求解线性方程组非线性方程组

求解线性方程组 solve,linsolve 例: A=[5 0 4 2;1 -1 2 1;4 1 2 0;1 1 1 1]; %矩阵的行之间用分号隔开,元素之间用逗号或空格 B=[3;1;1;0] X=zeros(4,1);%建立一个4元列向量 X=linsolve(A,B) diff(fun,var,n):对表达式fun中的变量var求n阶导数。 例如:F=sym('u(x,y)*v(x,y)'); %sym()用来定义一个符号表达式 diff(F); %matlab区分大小写 pretty(ans) %pretty():用习惯书写方式显示变量;ans是答案表达式 非线性方程求解 fsolve(fun,x0,options) 为待解方程或方程组的文件名;fun其中 x0位求解方程的初始向量或矩阵; option为设置命令参数 建立文件fun.m: function y=fun(x) y=[x(1)-0.5*sin(x(1))-0.3*cos(x(2)), ... x(2) - 0.5*cos(x(1))+0.3*sin(x(2))]; >>clear;x0=[0.1,0.1];fsolve(@fun,x0,optimset('fsolve')) 注: ...为续行符 m文件必须以function为文件头,调用符为@;文件名必须与定义的函数名相同;fsolve()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程。Matlab求解线性方程组 AX=B或XA=B 在MATLAB中,求解线性方程组时,主要采用前面章节介绍的除法运算符“/”和“\”。如: X=A\B表示求矩阵方程AX=B的解; 的解。XA=B表示矩阵方程B/A=X. 对方程组X=A\B,要求A和B用相同的行数,X和B有相同的列数,它的行数等于矩阵A的列数,方程X=B/A同理。 如果矩阵A不是方阵,其维数是m×n,则有: m=n 恰定方程,求解精确解; m>n 超定方程,寻求最小二乘解; m

遗传算法解非线性方程组的Matlab程序

遗传算法解非线性方程组的Matlab程序 程序用MATLAB语言编写。之所以选择MATLB,是因为它简单,但又功能强大。写1行MATLAB程序,相当于写10行C++程序。在编写算法阶段,最好用MATLAB语言,算法验证以后,要进入工程阶段,再把它翻译成C++语言。 本程序的算法很简单,只具有示意性,不能用于实战。 非线性方程组的实例在函数(2)nonLinearSumError1(x)中,你可以用这个实例做样子构造你自己待解的非线性方程组。 %注意:标准遗传算法的一个重要概念是,染色体是可能解的2进制顺序号,由这个序号在可能解的集合(解空间)中找到可能解 %程序的流程如下: %程序初始化,随机生成一组可能解(第一批染色体) %1: 由可能解的序号寻找解本身(关键步骤) %2:把解代入非线性方程计算误差,如果误差符合要求,停止计算 %3:选择最好解对应的最优染色体 %4:保留每次迭代产生的最好的染色体,以防最好染色体丢失 %5: 把保留的最好的染色体holdBestChromosome加入到染色体群中 %6: 为每一条染色体(即可能解的序号)定义一个概率(关键步骤) %7:按照概率筛选染色体(关键步骤) %8:染色体杂交(关键步骤) %9:变异 %10:到1 %这是遗传算法的主程序,它需要调用的函数如下。 %由染色体(可能解的2进制)顺序号找到可能解: %(1)x=chromosome_x(fatherChromosomeGroup,oneDimensionSet,solutionSum); %把解代入非线性方程组计算误差函数:(2)functionError=nonLinearSumError1(x); %判定程是否得解函数:(3)[solution,isTrue]=isSolution(x,funtionError,solutionSumError); %选择最优染色体函数: %(4)[bestChromosome,leastFunctionError]=best_worstChromosome(fatherChromosomeGroup,functionError); %误差比较函数:从两个染色体中,选出误差较小的染色体 %(5)[holdBestChromosome,holdLeastFunctionError]... % =compareBestChromosome(holdBestChromosome,holdLeastFunctionError,... % bestChromosome,leastFuntionError) %为染色体定义概率函数,好的染色体概率高,坏染色体概率低 %(6)p=chromosomeProbability(functionError); %按概率选择染色体函数: %(7)slecteChromosomeGroup=selecteChromome(fatherChromosomeGroup,p); %父代染色体杂交产生子代染色体函数 %(8)sonChrmosomeGroup=crossChromosome(slecteChromosomeGroup,2); %防止染色体超出解空间的函数 %(9)chromosomeGroup=checkSequence(chromosomeGroup,solutionSum) %变异函数 %(10)fatherChromosomeGroup=varianceCh(sonChromosomeGroup,0.8,solutionN); %通过实验有如下结果: %1。染色体应当多一些

(完整版)数值计算方法上机实习题答案

1. 设?+=1 05dx x x I n n , (1) 由递推公式n I I n n 1 51+-=-,从0I 的几个近似值出发,计算20I ; 解:易得:0I =ln6-ln5=0.1823, 程序为: I=0.182; for n=1:20 I=(-5)*I+1/n; end I 输出结果为:20I = -3.0666e+010 (2) 粗糙估计20I ,用n I I n n 51 5111+- =--,计算0I ; 因为 0095.05 6 0079.01020 201 020 ≈<<≈??dx x I dx x 所以取0087.0)0095.00079.0(2 1 20=+= I 程序为:I=0.0087; for n=1:20 I=(-1/5)*I+1/(5*n); end I 0I = 0.0083 (3) 分析结果的可靠性及产生此现象的原因(重点分析原因)。 首先分析两种递推式的误差;设第一递推式中开始时的误差为000I I E '-=,递推过程的舍入误差不计。并记n n n I I E '-=,则有01)5(5E E E n n n -==-=-Λ。因为=20E 20020)5(I E >>-,所此递推式不可靠。而在第二种递推式中n n E E E )5 1(5110-==-=Λ,误差在缩小, 所以此递推式是可靠的。出现以上运行结果的主要原因是在构造递推式过程中,考虑误差是否得到控制, 即算法是否数值稳定。 2. 求方程0210=-+x e x 的近似根,要求4 1105-+?<-k k x x ,并比较计算量。 (1) 在[0,1]上用二分法; 程序:a=0;b=1.0; while abs(b-a)>5*1e-4 c=(b+a)/2;

非线性方程组的求解

非线性方程组的求解 摘要:非线性方程组求解是数学教学中,数值分析课程的一个重要组成部分,作为一门学科,其研究对象是非线性方程组。求解非线性方程组主要有两种方法:一种是传统的数学方法,如牛顿法、梯度法、共轭方向法、混沌法、BFGS 法、单纯形法等。传统数值方法的优点是计算精度高,缺点是对初始迭代值具有敏感性,同时传统数值方法还会遇到计算函数的导数和矩阵求逆的问题,对于某些导数不存在或是导数难求的方程,传统数值方法具有一定局限性。另一种方法是进化算法,如遗传算法、粒子群算法、人工鱼群算法、差分进化算法等。进化算法的优点是对函数本身没有要求,不需求导,计算速度快,但是精度不高。 关键字:非线性方程组、牛顿法、BFGS 法、记忆梯度法、Memetic 算法 1: 三种牛顿法:Newton 法、简化Newton 法、修改的Newton 法【1-3】 求解非线性方程组的Newton 法是一个最基本而且十分重要的方法, 目前使用的很多有效的迭代法都是以Newton 法为基础, 或由它派生而来。 n 个变量n 个方程的非线性方程组, 其一般形式如下: ???????===0),...,(... 0),...,(0),...,(21212211n n n n x x x f x x x f x x x f (1) 式(1)中,),...,(21n i x x x f ( i=1, ?, n) 是定义在n 维Euclid 空间Rn 中开域 D 上 的实值函数。若用向量记号,令: ????????????=n x x x ...X 21,????????????=??????????????====)(...)()(0),...,(...0),..,(0)...,()(2121212,211X f X f X f x x x f x x x f x x x f X F n n n n n

相关主题
文本预览
相关文档 最新文档