求matlab编程 用二分法和牛顿迭代法求根号a

求matlab编程 用二分法和牛顿迭代法求根号a,第1张

对于求平方根,变成晌梁明方程模式为f(x)=x^2-a,即渣纤求此方程的实根;

下面编写了两个function函数,可宴告以直接调用.

二分法:

function x=sqrt_bisect(a)

f=@(x)x^2-a

if a0

xb=x

elseif f(xa)*f(x)>0

xa=x

else

break

end

end

end

x

牛顿迭代法:

function x=sqrt_newton(a)

f=@(x)x^2-a

df=diff(sym('x^2-a'))

if a1e-6

x0=x1

x1=x0-f(x0)/subs(df,x0)

end

end

x=x1

调用格式为:

sqrt_bisect(3)

ans =

1.7321

或者

sqrt_newton(2)

ans =

1.4142

function [ A ] = cal( a,b,v )%a,b表示区间,v是精度

i=1

x = (a+b)/2

A=[i x]

t = x-(x^3-x-1)/(3*x^2-1)%迭代函数

while(abs(t-x)>v)

i=i+1

x = t

A = [Ai x]

t = x-(x^3-x-1)/(3*x^2-1)%迭代函数

end

A = [Ai+1 t]

end

运行结果:

>>format long

>>cal(1,2,0.00001)

ans =

1.000000000000000   1.500000000000000

2.000000000000000   1.347826086956522

3.000000000000000   1.325200398950907

4.000000000000000   1.324718173999054

5.000000000000000   1.324717957244790

牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根,此时线性收敛,但是可通过一些方法变成超线性收敛。另外该方法广泛用于计算机编程中。

已经证明,如果是连续的,并且待求的零点是孤立的,那么在零点周围存在一个区域,只要初始值昌袜位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。[1]

迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对如迅逗应的是直接法(或者称为一次解法),即一次性解决问题。迭代算法是用计算机解决渣卖问题的一种基本方法。它利用计算机运算速度快、适合做重复性 *** 作的特点,让计算机对一组指令(或一定步骤)重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。

利用迭代算法解决问题,需要做好以下三个方面的工作:

一、确定迭代变量

在可以用迭代算法解决的问题中,至少存在一个可直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。

二、建立迭代关系式

所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。

三、对迭代过程进行控制

在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析得出可用来结束迭代过程的条件。

function newton(x0,e,N)

%输入xo为估计的迭代初值,e为规定的误差,N为最大迭代次誉塌哪数.

%输出x,y为最后迭代的两衫腔个近似根,k为迭代次数.

clc

format long

disp('迭代次数 近庆码似根')

k=0

x1=0

x2=x0

while (abs(x2-x1))>e

x1=x2

x2=x1-f(x1)./df(x1)

k=k+1

if k>N

return

end

%%%%%%记录并输出%%%%%%%%%

o1=sprintf('%3d',k)

o2=sprintf('%3.8f',x2)

OL=[o1,' ' o2]

disp(OL)

y(k)=x2

end

%%%%画图%%%%%%%

i=1:k

figure(2)

plot(i,y,'rD-')

grid on

xlabel('迭代次数')

ylabel('近似根')

title(['牛顿法求出的该方程的近似根 x^*=', num2str(x2,9)])

function y=f(x)

y=x^2/2-sin(x)-1

function y=df(x)

y=x-cos(x)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12432057.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存