数值分析-迭代法

合集下载

《数值分析》第4章 解线性方程组的迭代法

《数值分析》第4章 解线性方程组的迭代法
及矩阵 A Rn,n 有 || Ax ||t || A ||s|| x ||t
都成立,则称矩阵范数 || ||s和向量范数 || ||相t 容.
注意:为了保证矩阵范数和向量范数相容,最常用的矩阵范数
是由相应向量范数导出的.
4.1.3 矩阵范数和矩阵序列的极限
定理4 设 || |是| R中n 的向量范数,对于任何 A Rn,n若
4.1.2 向量范数和向量序列的极限
定义2 (向量范数) 如果在 Rn中定义了实值函数,记为 || ,||
对所有 x, y Rn以及 R,若满足 (1) || x || 0,当且仅当 x 0时, || x || (0非负性) ;
(2) || x ||| | || x |(|齐次性);
(3) || x y |||| x || || y(|三| 角不等式). 则称 || x ||为向量 x的范数 (或模).
于是有
c1 || x(k) x* || || x(k) x* || c2 || x(k) x* ||
lim ||
k
x(k)
x* || 0
lim ||
k
x(k)
x*
||
0
4.1.2 向量范数和向量序列的极限
例1 计算向量 x (5,1,3)的T 常用范数.

|| x || 5
|| x ||1 9
(3)|| A B |||| A || || B;||(三角不等式) (4) || AB |||| A || || B;|| 则称 || A ||为矩阵 A 的范数.
4.1.3 矩阵范数和矩阵序列的极限
相容性: 设有矩阵范数 || ||s和向量范数 || ||,t 如果对任何向量 x Rn

数值分析课件-数值分析14-线性方程组的迭代法

数值分析课件-数值分析14-线性方程组的迭代法

a13 L a23 L 0L
O
a1n a2n
a3n M
0
0
a12 a11
a13 L a11
a1n a11
a21 a22
0
a23 L a22
a2 n a22
BJ
a31 a33
a32 a33
0
L
a3n a33
M
M
M
OM
an1 ann
an2 ann
an3 ann
j 1
n
aij x(jk )
j i1
bi )
x ( k 1) 1
1 a11
(a12 x2(k)
a13 x3(k )
a14 x4(k )
a1n xn(k )
b1 )
x ( k 1) 2
1 a22
(a21 x1(k1)
a23 x3(k )
a24 x4(k )
a2n xn(k )
b2 )
x ( k 1) 2
2
得 x(1) = ( 0.5000, 2.8333, -1.0833 )T
M
x(9) = ( 2.0000, 3.0000, -1.0000 )T
举例(续)
SOR 迭代格式
x1( k x2( k
1) 1)
x(k) 1
x(k) 2
1
2 x1(k)
x(k) 2
2
8
x ( k 1) 1
Jacobi 迭代
令 A = D - L- U, 其中 D diag(a11, a22,K , ann),
0
L
a21
M
an1
0 a12 L
0 OO
,

第六章 迭代法-数值分析

第六章 迭代法-数值分析
1 j n
由极限存在准则得 即
k
lim xi( k ) xi =0
k
(i 1, 2, , n)
, n)
lim xi( k ) xi
(i 1, 2,
定义:设{ A( k ) }为n阶方阵序列,A为n阶方阵,如果 lim A( k ) A 0
k
其中 为矩阵范数,则称序列{ A( k ) }收敛于矩阵A,记为 lim A( k ) A


g
n
其中bij
aij aii
, (i j , i, j 1, 2,
, n), g i
bi (i 1, 2, aii
, n).
迭代公式x ( k 1) Bx ( k ) g (k 0,1, 2, )用方程组表示为
(k ) (k ) (k ) ( k 1) b13 x 3 b1n x n g x b 1 12 x 2 1 (k ) (k ) (k ) ( k 1) b 23 x 3 b 2 n x n g x2 b 21 x 1 2 ( k 1) (k ) (k ) (k ) b n1 x1 b n 2 x 2 b n,n 1 x n 1 g x n n 因此,在Jacobi迭代法的计算过程中,需同时保留两个
k k
即x是方程组Ax b的解。
引入误差向量
k
(k ) (k ) lim x x lim 0 所以 等价于 k

( k 1)
x
( k 1)
x

x ( k 1) Mx ( k ) g
x Mx g
则可得

( k 1)

数值分析第六章线性方程组迭代解法

数值分析第六章线性方程组迭代解法

1)
b2 a21x1(k) a23x3(k)
xn( k
1)
bn an1x1(k) an2 x2(k)
a1n
x(k) n
a11
a2n xn(k) a22
an,n1
x(k) n1
ann
x(k1) D1(L U ) x(k) D1b
D1(D A) x(k) D1b
(I D1A) x(k) D1b x(k) D1(b Ax(k) )
x(7) = ( 2.0000, 3.0000, -1.0000 )T 如何确定 SOR 迭代中的最优松弛因子是一件很困难的事
26
收敛性
收敛性定理 Jacobi 迭代收敛的充要条件 (J)<1 G-S 迭代收敛的充要条件 (G)<1 SOR 迭代收敛的充要条件 (L)<1
Jacobi 迭代收敛的充分条件 ||J|| <1 G-S 迭代收敛的充分条件 ||G|| < 1 SOR 迭代收敛的充分条件 ||L|| < 1
x1( k x2( k
1) 1)
1
x(k) 2
2
8
x ( k 1) 1
x(k) 3
3
x3(k1)
5
x ( k 1) 2
2
迭代可得: x(1) = ( 0.5000, 2.8333, -1.0833 )T
x(9) = ( 2.0000, 3.0000, -1.0000 )T
25
举例
SOR 迭代:
x(k1) i
bi
i 1
a x(k1) ij j
n
aij
x(jk
)
aii
j 1
j i 1

数值分析2 迭代法

数值分析2 迭代法

§2简单迭代法——不动点迭代(iterate)迭代法是数值计算中的一类典型方法,被用于数值计算的各方面中。

一、简单迭代法设方程f(x)=0 (3)在[a,b]区间内有一个根*x ,把(3)式写成一个等价的隐式方程x=g(x) (4)方程的根*x 代入(4)中,则有)(**=x g x (5)称*x 为g的不动点(在映射g下,象保持不变的点),方程求根的问题就转化为求(5)式的不动点的问题。

由于方程(4)是隐式的,无法直接得出它的根。

可采用一种逐步显式化的过程来逐次逼近,即从某个[a,b]内的猜测值0x 出发,将其代入(4)式右端,可求得)(01x g x =再以1x 为猜测值,进一步得到)(12x g x =重复上述过程,用递推关系——简单迭代公式求得序列}{k x 。

如果当k →∞时*→x x k ,}{k x 就是逼近不动点的近似解序列,称为迭代序列。

称(6)式为迭代格式,g(x)为迭代函数,而用迭代格式(6)求得方程不动点的方法,称为简单迭代法,当*∞→=x x k k lim 时,称为迭代收敛。

构造迭代函数g(x)的方法:(1)=x a x x -+2,或更一般地,对某个)(,02a x c x x c -+=≠;(2)x a x /=; (3))(21xa x x +=。

取a=3,0x =2及根*x =1.732051,给出三种情形的数值计算结果见表表 032=-x 的迭代例子问题:如何构造g(x),才能使迭代序列}{k x 一定收敛于不动点?误差怎样估计?通常通过对迭代序列}{k x 的收敛性进行分析,找出g(x)应满足的条件,从而建立一个一般理论,可解决上述问题。

二、迭代法的收敛性设迭代格式为),2,1,0()(1 ==+k x g x k k而且序列}{k x 收敛于不动点*x ,即∞→→-*k x x k (0时)因而有)3,2,1(1 =-≤-*-*k xx x x k k (7)由于),(),)((11*-*-*∈-'=-x x x x g x x k k k ξξ当g(x)满足中值定理条件时有),(),)((11*-*-*∈-'=-x x x x g x x k k k ξξ (8)注意到(8)式中只要1)(<<'L g ξ时,(7)式成立.经过上述分析知道,迭代序列的收敛性与g(x)的构造相关,只要再保证迭代值全落在[a,b]内,便得:假定迭代函数g(x)满足条件(1) 映内性:对任意x ∈[a,b]时,有a ≤g(x) ≤b ;(2) 压缩性:g(x)在[a,b]上可导,且存在正数L<1,使对任意 x ∈[a,b],有L x g <')( (9)则迭代格式)(1k k x g x =+对于任意初值0x ∈[a,b]均收敛于方程x=g(x)的根,并有误差估计式011x x LL x x kk --≤-*(10)证明 :收敛性是显然的。

数值分析 迭代法 二分法和迭代法原理

数值分析 迭代法 二分法和迭代法原理
| xk x*| L | xk1 x*| L2 | xk2 x*| Lk | x0 x*|
lim | xk x* | 0
k
即 lim xk x *.
k
(b) | xk1 x*| L | xk x*|
| xk 1 xk | | ( xk 1 x*) ( xk x*) | xk x * xk 1 x * (1 L) xk x * 1 xk x * xk 1 xk 1 L 又 | xk1 xk | ( xk ) ( xk1 ) | '( ) | | xk xk1 | L | xk xk1 |
等价变换
x = (x) 称为迭代函数
(x) 的不动点x*
不动点迭代
具体做法:
从一个给定的初值 x0 出发,计算 x1 = (x0), x2 = (x1), … x 若 k k 0 收敛,即存在 x* 使得 lim x k x *,则由 的连续
k
xk 1 lim xk 可得 x* = (x*),即 x* 是 的不 性和 lim k k
根的估计
引理3.1(连续函数的介值定理) 设f(x)在 [a,b]上连续,且f(a) f(b)<0,则存在x*(a,b) 使f(x*)=0。 例3.1 证明x33x1 = 0 有且仅有3个实根,并 确定根的大致位置使误差不超过 =0.5。 解:
单调性分析和解的位置 选步长h=2, 扫描节点函数值 异号区间内有根
ek 1 xk 1 x* ( xk ) ( x*) '( )ek e 取极限得 lim k 1 '( x*) 0 线性收敛. k e k

数值分析_迭代法

数值分析_迭代法

华北科技学院上机报告系(部)专业、班级姓名学号课程名称数值分析上机题目实验六,实验七任课教师指导教师成绩(优、良、中、及格、不及格)华 北 科 技 学 院 基 础 部实验六 解线性方程组的迭代法1.目的与要求:1) 熟悉求解线性方程组的有关理论哈方法。

2) 会编制雅可比迭代和高斯—塞得尔迭代法。

3) 通过实际计算,进一步了解各算法的优缺点,选择合适的数值方法。

2.雅可比迭代法算法设方程组AX=b 的系数矩阵的对角元素0(1,2,,),iii n a≠=L M 为迭代次数容许的最大值,ε为容许误差.① 取初始向量(0)(0)(0),(,,,)12Tx x x x n =L 令k=0;② 对1,2,,i n =L 计算 (1)()11();nk k ii ij j j iij ixb a x a +=≠=-∑③ 如果(1)()1,nk k iii xx ε+=-<∑则输出(1)k x+,结束;否则执行④,④ 如果,k M ≥则不收敛,终止程序;否则1,k k ←+转②.1.分别用雅可比迭代法与高斯-塞德尔迭代法解下列方程组:2),311300010000151335901100002709311000000230010793000090,00030577050200000747300012000003041007000050027270022910RI V R V =---⎡⎤⎡⎤⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥---⎢⎥⎢⎢⎥⎢==----⎢⎥⎢-⎢⎥⎢⎢⎥⎢--⎢⎥⎢--⎢⎥⎢⎢⎥⎢--⎣⎦⎣⎦其中⎥⎥⎥⎥⎥⎥⎥⎥1.用雅可比迭代法计算: #include "stdafx.h" #include "iostream.h" #include"stdio.h" #include"math.h" #include"conio.h" #include"malloc.h" #include <stdlib.h> #define EPS 1e-8 #define MAX 100float *Jacobi(float a[9][10],int n) { float *x,*y,s; double epsilon; int i,j,k=1; x=(float *)malloc(n*sizeof(float)); y=(float *)malloc(n*sizeof(float)); for(i=0;i<n;i++) x[i]=0; while(1) { k++; epsilon=0; for(i=0;i<n;i++) { s=0; for(j=0;j<n;j++) { if(j==i) continue;s=s+a[i][j]*x[j];}y[i]=(a[i][n]-s)/a[i][i];epsilon=epsilon+fabs(y[i]-x[i]);}//if (epsilon>EPS);if(k>=MAX){return y;}for(i=0;i<n;i++)x[i]=y[i];}}void main(){int i;float a[9][10]={{31,-13,0,0,0,-10,0,0,0,-15}, {-13,35,-9,0,-11,0,0,0,0,27},{0,-9,31,-10,0,0,0,0,0,-23},{0,0,-10,79,-30,0,0,0,-9,0},{0,0,0,-30,57,-7,0,-5,0,-20},{0,0,0,0,7,47,-30,0,0,12},{0,0,0,0,0,-30,41,0,0,-7},{0,0,0,0,-5,0,0,27,-2,7},{0,0,0,0,0,0,0,-2,29,-10}};float *x;x=(float *)malloc(9*sizeof(float));printf("结果为:\n");x=Jacobi(a,9);for(i=0;i<9;i++)printf("x[%d]=%f\n",i,x[i]);}程序运行结果如下:结果为:x[0]=-0.200550x[1]=0.368393x[2]=-0.731859x[3]=-0.300318x[4]=-0.446577x[5]=0.399384x[6]=0.121501x[7]=0.151792x[8]=-0.334359Press any key to continue2.用高斯-塞德尔迭代法:#include "stdafx.h"#include"stdio.h"#include"math.h"#include"conio.h"#include "iostream"#include"malloc.h"#define N 100void main(){int i;float *x;float c[90]={31,-13,0,0,0,-10,0,0,0,-15,-13,35,-9,0,-11,0,0,0,0,27,0,-9,31,-10,0,0,0,0,0,-23,0,0,-10,79,-30,0,0,0,-9,0,0,0,0,-30,57,-7,0,-5,0,-20,0,0,0,0,7,47,-30,0,0,12,0,0,0,0,0,-30,41,0,0,-7,0,0,0,0,-5,0,0,27,-2,7,0,0,0,0,0,0,0,-2,29,-10};float *GauseSeide(float *,int);x=GauseSeide(c,9);for(i=0;i<9;i++)printf("x[%d]=%f\n",i,x[i]);}float *GauseSeide(float *a,int n){int i,j,nu=0;float *x,dx,d,wucha;x=(float *)malloc(n*sizeof(float));for(i=0;i<=n-1;i++)x[i]=0.0;while(fabs(wucha)>1e-8){for(i=0;i<=n-1;i++){d=0.0;for(j=0;j<=n-1;j++)d+=*(a+i*(n+1)+j)*x[j];d=d-*(a+i*(n+1)+i)*x[i];dx=(*(a+i*(n+1)+n)-d)/(*(a+i*(n+1)+i));wc=x[i]-dx;x[i]=dx;}if(nu>=N){printf("迭代发散\n");exit(1);}nu++;}return x;}程序运行结果如下:x[0]=-0.200551x[1]=0.368393x[2]=-0.731860x[3]=-0.300318x[4]=-0.446577x[5]=0.399384x[6]=0.121500x[7]=0.151792x[8]=-0.334359Press any key to continue实验七方程求根1.目的与要求:1) 通过对二分法与牛顿迭代法作编程练习与上机运算,进一步体会二分法与牛顿迭代法的不同特点;2) 编写割线迭代法的程序,求非线性方程的解,并与牛顿迭代法作比较。

数值分析--第三章--迭代法

数值分析--第三章--迭代法

数值分析--第三章--迭代法迭代⼀般⽅程:本⽂实例⽅程组:⼀.jacobi迭代法从第i个⽅程组解出xi。

线性⽅程组Ax=b,先给定⼀组x的初始值,如[0,0,0],第⼀次迭代,⽤x2=0,x3=0带⼊第⼀个式⼦得到x1的第⼀次迭代结果,⽤x1=0,x3=0,带⼊第⼆个式⼦得到x2的第⼀次迭代结果,⽤x1=0,x2=0带⼊第三个式⼦得到x3的第⼀次迭代结果。

得到第⼀次的x后,重复第⼀次的运算。

转化成⼀般的形式:(其中L是A的下三⾓部分,D是A的对⾓元素部分,U 是上三⾓部分)得到迭代公式:其中的矩阵B和向量f如何求得呢?其实,矩阵B的计算也很简单,就是每⾏的元素/该⾏上的对⾓元素⼆.Gauss-Seidel迭代法【收敛速度更快】这个可以和jacobi法对⽐进⾏理解,我们以第⼆次迭代为例(这⾥的第⼀次迭代结果都⽤⼀样的,懒得去换)从上表对⽐结果可以看出,Jacobi⽅法的第⼆次迭代的时候,都是从第⼀次迭代结果中,获取输⼊值。

上⼀次迭代结果[2.5,3.0,3.0],将这个结果带⼊上⾯式⼦1,得到x1=2.88,;将[2.5,3.0,3.0]替换成[2.88,3.0,3.0]带⼊第⼆个式⼦的运算,这⾥得到x2=1.95,所以把[2.88,3.0,3.0]替换成[2.88,1.95,3.0]输⼊第三个式⼦计算X3=1.0.这就完成了这⼀次的迭代,得到迭代结果[2.88,1.95,1.0],基于这个结果,开始下⼀次迭代。

特点:jacobi迭代法,需要存储,上⼀次的迭代结果,也要存储这⼀次的迭代结果,所以需要两组存储单元。

⽽Gauss-Seidel迭代法,每⼀次迭代得到的每⼀个式⼦得到的值,替换上⼀次迭代结果中的值即可。

所以只需要⼀组存储单元。

转化成⼀般式:注意:第⼆个式⼦中的是k+1次迭代的第⼀个式⼦的值,不是第k次迭代得值。

计算过程同jacobi迭代法的类似三.逐次超松弛法SOR法上⾯仅仅通过实例说明,Jacobi和Seidel迭代的运算过程。

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

华北科技学院上机报告系(部)专业、班级姓名学号课程名称数值分析上机题目实验六,实验七任课教师指导教师成绩(优、良、中、及格、不及格)华北科技学院基础部实验六 解线性方程组的迭代法1.目的与要求:1) 熟悉求解线性方程组的有关理论哈方法。

2) 会编制雅可比迭代和高斯—塞得尔迭代法。

3) 通过实际计算,进一步了解各算法的优缺点,选择合适的数值方法。

2.雅可比迭代法算法设方程组AX=b 的系数矩阵的对角元素0(1,2,,),iii n a≠=M 为迭代次数容许的最大值,ε为容许误差.① 取初始向量(0)(0)(0),(,,,)12Tx x x x n =令k=0;② 对1,2,,i n =计算(1)()11();nk k ii ij j j iij ixb a x a +=≠=-∑③ 如果(1)()1,nk k iii xx ε+=-<∑则输出(1)k x+,结束;否则执行④,④ 如果,k M ≥则不收敛,终止程序;否则1,k k ←+转②.1.分别用雅可比迭代法与高斯-塞德尔迭代法解下列方程组:2),311300010000151335901100002709311000000230010793000090,00030577050200000747300012000003041007000050027270022910RI V R V =---⎡⎤⎡⎤⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥---⎢⎥⎢⎢⎥⎢==----⎢⎥⎢-⎢⎥⎢⎢⎥⎢--⎢⎥⎢--⎢⎥⎢⎢⎥⎢--⎣⎦⎣⎦其中⎥⎥⎥⎥⎥⎥⎥⎥1.用雅可比迭代法计算: #include "stdafx.h" #include "iostream.h"#include"stdio.h"#include"math.h"#include"conio.h"#include"malloc.h"#include <stdlib.h>#define EPS 1e-8#define MAX 100float *Jacobi(float a[9][10],int n){float *x,*y,s;double epsilon;int i,j,k=1;x=(float *)malloc(n*sizeof(float));y=(float *)malloc(n*sizeof(float));for(i=0;i<n;i++)x[i]=0;while(1){ k++;epsilon=0;for(i=0;i<n;i++){s=0;for(j=0;j<n;j++){if(j==i) continue;s=s+a[i][j]*x[j];}y[i]=(a[i][n]-s)/a[i][i];epsilon=epsilon+fabs(y[i]-x[i]);}//if (epsilon>EPS);if(k>=MAX){return y;}for(i=0;i<n;i++)x[i]=y[i];}}void main(){int i;float a[9][10]={{31,-13,0,0,0,-10,0,0,0,-15},{-13,35,-9,0,-11,0,0,0,0,27},{0,-9,31,-10,0,0,0,0,0,-23},{0,0,-10,79,-30,0,0,0,-9,0},{0,0,0,-30,57,-7,0,-5,0,-20},{0,0,0,0,7,47,-30,0,0,12},{0,0,0,0,0,-30,41,0,0,-7},{0,0,0,0,-5,0,0,27,-2,7},{0,0,0,0,0,0,0,-2,29,-10}};float *x;x=(float *)malloc(9*sizeof(float));printf("结果为:\n");x=Jacobi(a,9);for(i=0;i<9;i++)printf("x[%d]=%f\n",i,x[i]);}程序运行结果如下:结果为:x[0]=-0.200550x[1]=0.368393x[2]=-0.731859x[3]=-0.300318x[4]=-0.446577x[5]=0.399384x[6]=0.121501x[7]=0.151792x[8]=-0.334359Press any key to continue2.用高斯-塞德尔迭代法:#include "stdafx.h"#include"stdio.h"#include"math.h"#include"conio.h"#include "iostream"#include"malloc.h"#define N 100void main(){int i;float *x;float c[90]={31,-13,0,0,0,-10,0,0,0,-15,-13,35,-9,0,-11,0,0,0,0,27,0,-9,31,-10,0,0,0,0,0,-23,0,0,-10,79,-30,0,0,0,-9,0,0,0,0,-30,57,-7,0,-5,0,-20,0,0,0,0,7,47,-30,0,0,12,0,0,0,0,0,-30,41,0,0,-7,0,0,0,0,-5,0,0,27,-2,7,0,0,0,0,0,0,0,-2,29,-10};float *GauseSeide(float *,int);x=GauseSeide(c,9);for(i=0;i<9;i++)printf("x[%d]=%f\n",i,x[i]);}float *GauseSeide(float *a,int n){int i,j,nu=0;float *x,dx,d,wucha;x=(float *)malloc(n*sizeof(float));for(i=0;i<=n-1;i++)x[i]=0.0;while(fabs(wucha)>1e-8){for(i=0;i<=n-1;i++){d=0.0;for(j=0;j<=n-1;j++)d+=*(a+i*(n+1)+j)*x[j];d=d-*(a+i*(n+1)+i)*x[i];dx=(*(a+i*(n+1)+n)-d)/(*(a+i*(n+1)+i));wc=x[i]-dx;x[i]=dx;}if(nu>=N) { printf("迭代发散\n"); exit(1); } nu++; }return x; }程序运行结果如下: x[0]=-0.200551 x[1]=0.368393 x[2]=-0.731860 x[3]=-0.300318 x[4]=-0.446577 x[5]=0.399384 x[6]=0.121500 x[7]=0.151792 x[8]=-0.334359Press any key to continue实验七 方程求根1.目的与要求:1) 通过对二分法与牛顿迭代法作编程练习与上机运算,进一步体会二分法与牛顿迭代法的不同特点;2) 编写割线迭代法的程序,求非线性方程的解,并与牛顿迭代法作比较。

2.二分法算法给定区间[a,b],并设f(a)与f(b)符号相反,取为ε根的容许误差,δ为|f(x)|的容许误差。

① 令c=(a+b)/2② 如果(c-a)<ε或|f(c)|<δ,则输出c ,结束;否则执行③, ③ 如果f(a)f(c)>0,则令a:=c ;否则b:=c ,重复①,②,③。

3.牛顿迭代法算法给定初始值ε,0x 为根的容许误差,η为|f(x)|的容许误差,N 为迭代次数的容许值。

①如果0)(0='x f 或迭代次数大于N ,则算法失败,结束;否则执行②,②计算)()(0001x f x f x x '-=, ③若ε<-01x x 或η<)(1x f ,则输出1x ,程序结束;否则执行④, ④ 10x x =,转向(1).实验内容:1.用牛顿法求方程01=-x xe 在10=x 附近的解.#include "stdafx.h" #include <iostream> #include <stdio.h> #include <math.h> #define N 100 #define EPS 1e-6 #define ETA 1e-8void main() { float f(float); float f1(float); float x0,y0; float Newton(float (*)(float),float (*)(float),float); printf("Please input x0\n"); scanf("%f",&x0); printf("x(0)=%f\n",x0); y0=Newton(f,f1,x0); printf("\nThe root of the equation is x=%f\n",y0); }float Newton(float (*f)(float),float (*f1)(float),float x0) { float x1,d; int k=0; do { x1=x0-f(x0)/f1(x0); if((k++>N)||(fabs(f1(x1))<EPS)) { printf("\nNewton method failed");exit(0);}d=(fabs(x1)<1?x1-x0:(x1-x0)/x1);x0=x1;printf("x(%d)=%f\t",k,x0);}while(fabs(d)>EPS&&fabs(f(x1))>ETA);return x1;}float f(float x){return x*exp(x)-1;}float f1(float x){return exp(x)+x*exp(x);}程序运行结果如下:Please input x01x(0)=1.000000x(1)=0.683940 x(2)=0.577454 x(3)=0.567230 x(4)=0.567143 x(5)=0.567143The root of the equation is x=0.567143Press any key to continue2.编写一个割线法的程序,求解上题。

相关文档
最新文档