简化牛顿迭代法收敛的证明

简化牛顿迭代法收敛的证明,第1张

牛顿迭代收敛有如下定理:

设已知 f(x) = 0 有根 a,f(x) 充分光滑(各阶导数存在且连续)

若 f'(a) != 0(单重零点),则初值取在 a 的某个邻域内时,迭代法 x[n+1] = x[n] - f(x[n])/f'(x[n]) 得到

序列 x[n] 总收敛到 a,且收敛速度至少是二阶的

若 f'(a) == 0(多重零点),则初值取在 a 的某个邻域内时,收敛速度是一阶的

记 g(x)=x-f(x)/f'(x),其中"某个邻域"可由 |g'(x)|

扩展资料:

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

一、确定迭代变量

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

二、建立迭代关系式

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

三、对迭代过程进行控制

在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地执行下去。迭代过程的控制通常可分为两种情况:

一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析得出可用来结束迭代过程的条件。

参考资料来源:百度百科-牛顿迭代法

1)迭代法设计思想最简单:x=f(x) 但这种方法初值很主要,不然容易发散。

2)二分法设计思想是先给定区间[a,b],要求f(a)与f(b)是异号,保证区间内与x轴有交点,求x=(a+b)/2,求f(x),检查f(x)与f(a)是否同号,如果是同号,把x当成新的a,否则把x当成新的b,得到新的区间,重复求a和b的中点的值,判断与f(a)是否同号,不断循环下去,直到达到精度为止。

3)牛顿迭代法设计思想是对f(x0)某点求切线,与x轴交x1点后,把x1当成x0,再求出其相应新的f(x0),再对其求切线,找到与x轴的新交点,不断循环下去,直到达到精度为止。这种方法要求先对函数求一阶导数,然后再迭代:x1=x0-f(x0)/f‘(x0)

4)弦截法设计思想利用插值原理,避免上面的求导,要求在f(x)上取二点x0,x1,做过f(x0),f(x1)的直线交x轴一点为x,把原来的x1当成x0,把x当成x1,再重复上面的做直线的过程,不断循环下去,直到达到精度为止。迭代公式:x=x1-(x1-x0)f(x1)/(f(x1)-f(x0))

while (rsnext()) {

Bars bar = new Bars();

barsetId(rsgetLong("id"));

barsetName(rsgetString("name"));

barsetType(rsgetInt("type"));

barsetCreatorId(rsgetLong("creator_id"));

resultListadd(bar);

}

#include

#include

using

namespace

std;

void

fun(double,

double);

int

main()

{

double

x0

=

0,

epsilon;

//将x初值赋为0,根据题目要求

cout

<<

"请输入允许的最大误差:

";

cin

>>

epsilon;

fun(x0,

epsilon);

return

0;

}

void

fun(double

x0,

double

epsilon)

{

double

x1

=

x0;

x0

=

(x1

-

(x1x1

+

3x1

-

4)

/

(2x1

+

3));

//按指定的方程计算新的近似根

if(fabs(x0

-

x1)

>

epsilon)

//大于误差值的时候继续迭代

fun(x0,

epsilon);

else

cout

<<

"方程的近似根是"

<<

x0

<<

endl;

}

你看下,我运行了没错误

牛顿迭代法的思想是这样的:

x和x0不断的迭代

令f(x)=5x^5-8x^3+10x^2-7x+25

则f'(x)=25x^4-24x^2+20x-7

有:

x=x0-f(x)/f'(x)

收敛于:|x-x0|<e(有是一个很小的数,在这里取e为0000001),具体代码如下:

#include "stdioh"

#include "mathh"

/牛顿迭代法求根/

void main()

{

double x0,x;

double f,g;

x0=1; /给一个初始值/

do

{

x=x0;

f=5pow(x,5)-8pow(x,3)+10xx-7x+25;

g=25pow(x,4)-24pow(x,3)+20x-7;

x0=x-f/g;

}while(fabs(x-x0)>1e-6);

printf("%f\n",x);

}

以上就是关于简化牛顿迭代法收敛的证明全部的内容,包括:简化牛顿迭代法收敛的证明、迭代法,二分法,牛顿迭代法,弦截法的算法设计思想、根据牛顿迭代法,编写程序。要求,由键盘输入a及n值,编程计算a的平方根、立方根、次方根等。迭代的结等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/zz/9605290.html

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

发表评论

登录后才能评论

评论列表(0条)

保存