熟悉用二分法,迭代法,牛顿法和弦截法求解非线性方程。

熟悉用二分法,迭代法,牛顿法和弦截法求解非线性方程。
熟悉用二分法,迭代法,牛顿法和弦截法求解非线性方程。

实验报告学院(系)名称:计算机与通信工程

实验步骤:二分法:

迭代法:

牛顿法:

双点弦截法:

用二分法求方程x2-x-1=0的正根,要求准确到小数点后第一位#include

#include

#define ADJUST1 0.01

#define ADJUST2 0.001

#define EX 0.000001

#define INF 999999999.99

double func1(double x)//二分法求的方程

{

return (x*x-x-1);

}

double func2_1(double x)//迭代法的方程

{

return exp(-x);

}

double res1(double a,double b,double (*fun1)(double x))//二分法

{

double fa=fun1(a);

double fb=fun1(b);

double fmid=fun1((a+b)/2);

while(fabs(b-a)>=ADJUST1)

{

if(fabs(fmid-0a)

return fmid;

else if(fmid*fa<0)

{

b=(a+b)/2;

fa=fun1(a);

fb=fun1(b);

fmid=fun1((a+b)/2);

}

else if(fmid*fb<0)

{

a=(a+b)/2;

fa=fun1(a);

fb=fun1(b);

fmid=fun1((a+b)/2);

}

}

return (a+b)/2;

}

int main()

{

printf("%.2f\n",res1(0,100,func1));

printf("%.2f\n",func2_1(-1));

return 0;

}

用迭代法和牛顿法求解方程x=e-x在x=0.5附近的一个根,要求精确到小数点后三位#include

#include

#define ADJUST1 0.01

#define ADJUST2 0.001

#define EX 0.000001

#define INF 999999999.99

double func2_1(double x)//迭代法的方程

{

return exp(-x);

}

double res2(double x0,double e,int n,double (*fun)(double x))//迭代法,迭代失败标志,输出Fail!,并返回INF

{

int k=1;

double x1;

x1=fun(x0);

while(k!=n)

{

if(fabs(x1-x0)

return x1;

x0=x1;

x1=fun(x0);

k++;

}

if(k==n)

printf("Fail!\n");

return INF;

}

int main()

{

printf("%.3f\n",res2(0.5,0.001,100,func2_1));//q2.1

printf("%.3f\n",func2_1(0.567));//for test

return 0;

}

用双点弦截法求方程x3+3x2-x-9=0在区间[1,2]内的一个实根,精确到五位有效数字

#include

#include

#define ADJUST1 0.01

#define ADJUST2 0.001

#define EX 0.000001

#define INF 999999999.99

double dfunc2_2(double x)//牛顿法方程导数

{

return (0-exp(-x)-1);

}

double func2_2(double x)//牛顿法方程

{

return exp(-x)-x;

}

double res3(double x0,double e,int n,double (*fun)(double x),double (*dfun)(double x)) //牛顿迭代法,奇异标志为返回INF,失败标志为返回INF,并输出Fail!

{

int k=1;

double x1;

if(fabs(dfun(x0)-0)

return INF;

x1=x0-fun(x0)/dfun(x0);

while(k!=n)

{

if(fabs(x1-x0)

return x1;

x0=x1;

x1=x0-fun(x0)/dfun(x0);

}

if(k==n)

printf("Fail!\n");

return INF;

}

int main()

{

printf("%.3f\n",res3(0.5,0.001,100,func2_2,dfunc2_2));

return 0;

}

牛顿法求非线性方程的根

学科前沿讲座论文 班级:工程力学13-1班姓名:陆树飞

学号:02130827

牛顿法求非线性方程的根 一 实验目的 (1)用牛顿迭代法求解方程的根 (2)了解迭代法的原理,了解迭代速度跟什么有关 题目:用Newton 法计算下列方程 (1) 013=--x x , 初值分别为10=x ,7.00=x ,5.00=x ; (2) 32943892940x x x +-+= 其三个根分别为1,3,98-。当选择初值02x =时 给出结果并分析现象,当6510ε-=?,迭代停止。 二 数学原理 对于方程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,… 这就是牛顿迭代法。

三 程序设计 (1)对于310x x --=,按照上述数学原理,编制的程序如下 program newton implicit none real :: x(0:50),fx(0:50),f1x(0:50)!分别为自变量x ,函数f(x)和一阶导数f1(x) integer :: k write(*,*) "x(0)=" read(*,*) x(0) !输入变量:初始值x(0) open(10,file='1.txt') do k=1,50,1 fx(k)=x(k-1)**3-x(k-1)-1 f1x(k)=3*x(k-1)**2-1 x(k)=x(k-1)-fx(k)/f1x(k) !牛顿法 write(*,'(I3,1x,f11.6)') k,x(k) !输出变量:迭代次数k 及x 的值 write(10,'(I3,1x,f11.6)') k,x(k) if(abs(x(k)-x(k-1))<1e-6) exit !终止迭代条件 end do stop end (2)对于32943892940x x x +-+=,按照上述数学原理,编制的程序如下 program newton implicit none

牛顿迭代法

牛顿迭代法 李保洋 数学科学学院信息与计算科学学号:060424067 指导老师:苏孟龙 摘要:牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法,即牛顿迭代法.迭代法是一种不断用变量的旧值递推新值的过程.跟迭代法相对应的是直接法或者称为一次解法,即一次性解决问题.迭代法又分为精确迭代和近似迭代.“牛顿迭代法”属于近似迭代法,本文主要讨论的是牛顿迭代法,方法本身的发现和演变和修正过程,避免二阶导数计算的Newton迭代法的一个改进,并与中国古代的算法,即盈不足术,与牛顿迭代算法的比较. 关键词:Newton迭代算法;近似求解;收敛阶;数值试验;中国古代数学; 九章算术;Duffing方程;非线性方程;收敛速度;渐进性 0 引言: 迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法或者称为一次解法,即一次性解决问题.迭代法又分为精确迭代和近似迭代.“二分法”和“牛顿迭代法”属于近似迭代法. 迭代算法是用计算机解决问题的一种基本方法.它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值.具体使用迭代法求根时应注意以下两种可能发生的情况: (1)如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制. (2)方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败. 所以利用迭代算法解决问题,需要做好以下三个方面的工作: 1、确定迭代变量.在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量. 2、建立迭代关系式.所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系).迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成. 3、对迭代过程进行控制,在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题.不能让迭代过程无休止地重复执行下去.迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定.对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件. 1牛顿迭代法:

牛顿法非线性方程求解

《MATLAB 程序设计实践》课程考核 ---第37-38页 题1 : 编程实现以下科学计算算法,并举一例应用之。(参考书籍《精 通MAT LAB科学计算》,王正林等著,电子工业出版社,2009 年) “牛顿法非线性方程求解” 弦截法本质是一种割线法,它从两端向中间逐渐逼近方程的根;牛顿法本质上是一种切线法,它从一端向一个方向逼近方程的根,其递推公式为: - =+n n x x 1) ()(' n n x f x f 初始值可以取)('a f 和)('b f 的较大者,这样可以加快收敛速度。 和牛顿法有关的还有简化牛顿法和牛顿下山法。 在MATLAB 中编程实现的牛顿法的函数为:NewtonRoot 。 功能:用牛顿法求函数在某个区间上的一个零点。 调用格式:root=NewtonRoot )(```eps b a f 其中,f 为函数名; a 为区间左端点; b 为区间右端点 eps 为根的精度; root 为求出的函数零点。 ,

牛顿法的matlab程序代码如下: function root=NewtonRoot(f,a,b,eps) %牛顿法求函数f在区间[a,b]上的一个零点%函数名:f %区间左端点:a

%区间右端点:b %根的精度:eps %求出的函数零点:root if(nargin==3) eps=1.0e-4; end f1=subs(sym(f),findsym(sym(f)),a); f2=subs(sym(f),findsym(sym(f)),b); if (f1==0) root=a; end if (f2==0) root=b; end if (f1*f2>0) disp('两端点函数值乘积大于0 !'); return; else tol=1; fun=diff(sym(f)); %求导数 fa=subs(sym(f),findsym(sym(f)),a); fb=subs(sym(f),findsym(sym(f)),b); dfa=subs(sym(fun),findsym(sym(fun)),a); dfb=subs(sym(fun),findsym(sym(fun)),b); if(dfa>dfb) %初始值取两端点导数较大者 root=a-fa/dfa; else root=b-fb/dfb; end while(tol>eps) r1=root; fx=subs(sym(f),findsym(sym(f)),r1); dfx=subs(sym(fun),findsym(sym(fun)),r1); %求该点的导数值 root=r1-fx/dfx; %迭代的核心公式 tol=abs(root-r1); end end 例:求方程3x^2-exp(x)=0的一根 解:在MATLAB命令窗口输入: >> r=NewtonRoot('3*x^2-exp(x)',3,4) 输出结果: X=3.7331

二分法和牛顿法求解非线性方程(C语言)

(1)二分法求解非线性方程: #include #include #define f(x)((x*x-1)*x-1) void main() {float a,b,x,eps; int k=0; printf("intput eps\n");/*容许误差*/ scanf("%f",&eps); printf("a,b=\n"); for(;;) {scanf("%f,%f",&a,&b); if(f(a)*f(b)>=0)/*判断是否符合二分法使用的条件*/ printf("二分法不可使用,请重新输入:\n"); else break; } do {x=(a+b)/2; k++; if(f(a)*f(x)<0)/*如果f(a)*f(x)<0,则根在区间的左半部分*/ b=x; else if(f(a)*f(x)>0)/*否则根在区间的右半部分*/ a=x; else break; }while(fabs(b-a)>eps);/*判断是否达到精度要求,若没有达到,继续循环*/ x=(a+b)/2;/*取最后的小区间中点作为根的近似值*/ printf("\n The root is x=%f,k=%d\n",x,k); } 运行结果: intput eps 0.00001 a,b= 2,-5 The root is x=1.324721,k=20 Press any key to continue 总结:本题关键在于两个端点的取值和误差的判断,此程序较容易。二分法收敛速度较快,但缺点是只能求解单根。 (2)牛顿法求解非线性方程: #include #include float f(float x)/*定义函数f(x)*/ {return((-3*x+4)*x-5)*x+6;} float f1(float x)/*定义函数f(x)的导数*/

牛顿迭代法求解非线性方程组的代码

牛顿迭代法求解非线性方程组 非线性方程组如下: 221122121210801080 x x x x x x x ?-++=??+-+=?? 给定初值()00.0T x =,要求求解精度达到0.00001 1.首先建立函数()F X ,方程编程如下,将F.m 保存到工作路径中: function f=F(x) f(1)=x(1)^2-10*x(1)+x(2)^2+8; f(2)=x(1)*x(2)^2+x(1)-10*x(2)+8; f=[f(1),f(2)] ; 2.建立函数()DF X ,用于求方程的jacobi 矩阵,将DF.m 保存到工作路径中: function df=DF(x) df=[2*x(1)-10,2*x(2);x(2)^2+1,2*x(1)*x(2)-10]; %jacobi 矩阵是一阶偏导数以一定方式排列成的矩阵。 3.编程牛顿迭代法解非线性方程组,将newton.m 保存在工作路径中: clear,clc; x=[0,0]'; f=F(x);

df=DF(x); fprintf('%d %.7f %.7f\n',0,x(1),x(2)); N=4; for i=1:N y=df\f'; x=x-y; f=F(x); df=DF(x); fprintf('%d %.7f %.7f\n',i,x(1),x(2)); if norm(y)<0.0000001 break; else end end ezplot('x^2-10*x+y^2+8',[-6,6,-6,6]); hold on ezplot('x*y^2+x-10*y+8',[-6,6,-6,6]); 运行结果如下: 0 0.0000000 0.0000000 1 0.8000000 0.8800000 2 0.9917872 0.9917117

用牛顿迭代法求近似根

用牛顿迭代法求近似根

————————————————————————————————作者:————————————————————————————————日期:

第四题 题目:用Newton 法求方程在 74 28140x x -+= (0.1,1.9)中的近似根(初始近似值取为区间端点,迭代6次或误差小于0.00001). 解:此题是用牛顿迭代法求解近似根的问题 1. Newton 迭代法的算法公式及应用条件: 设函数在有限区间[a,b]上二阶导数存在,且满足条件 ⅰ. ()()0f a f b <; ⅱ. ()''f x 在区间[a,b]上不变号; ⅲ. ()'0f x ≠; ⅳ. ()()'f c f c b a ≤-,其中c 是a,b 中使()()''min(,)f a f b 达到的一个. 则对任意初始近似值0[,]x a b ∈,由Newton 迭代过程 ()()() 1'k k k k k f x x x x f x +=Φ=-,k=0,1,2… 所生成的迭代序列{ k x }平方收敛于方程()0f x =在区间[a,b]上的唯一解а. 对本题: )9.1()9.1(0 )8(4233642)(0 )16(71127)(0 )9.1(,0)1.0(,1428)(3225333647>?''<-=-=''<-=-='<>+-=f f x x x x x f x x x x x f f f x x x f Θ 故以1.9为起点 ?? ???='-=+9.1)()(01x x f x f x x k k k k 2. 程序编写 #include #include void main() { double x0,x=1.9; do

C++实现 牛顿迭代 解非线性方程组

C++实现牛顿迭代解非线性方程组(二元二次为例) 求解{0=x*x-2*x-y+0.5; 0=x*x+4*y*y-4; }的方程 #include #include #define N 2 // 非线性方程组中方程个数、未知量个数#define Epsilon 0.0001 // 差向量1范数的上限 #define Max 100 // 最大迭代次数 using namespace std; const int N2=2*N; int main() { void ff(float xx[N],float yy[N]); //计算向量函数的因变量向量yy[N] void ffjacobian(float xx[N],float yy[N][N]); //计算雅克比矩阵yy[N][N] void inv_jacobian(float yy[N][N],float inv[N][N]); //计算雅克比矩阵的逆矩阵inv void newdundiedai(float x0[N], float inv[N][N],float y0[N],float x1[N]); //由近似解向量x0 计算近似解向量x1 float x0[N]={2.0,0.25},y0[N],jacobian[N][N],invjacobian[N][N],x1[N],errornorm; int i,j,iter=0; //如果取消对x0的初始化,撤销下面两行的注释符,就可以由键盘x读入初始近似解向量for( i=0;i>x0[i]; cout<<"初始近似解向量:"<

C语言编程_牛顿迭代法求方程2

牛顿迭代公式 设r 是f(x) = 0的根,选取x0作为r 初始近似值,过点(x0,f(x0)) f(x)的切线L ,L 的方程为y = f(x0)+f'(x0)(x-x0),求出L 与x 轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r 的一次近似值。过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x 轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r 的二次近似值。重复以上过程,得r 的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r 的n+1次近似值,上式称为牛顿迭代公式。 解非线性方程 f(x)=0似方法。把f(x)在 x0 f(x) = f(x0)+(x -x0)f'(x0)+(x -x0)^2*f''(x0)/2! +… 取其线性部分,作为非线性方程f(x) = 0的近似方程,即泰勒展开的前两项,则有f(x0)+f'(x0)(x -x0)-f(x)=0 设f'(x0)≠0则其解为x1=x0-f(x0)/f'(x0) 这样,得到牛顿法的一个迭代序列:x(n+1)=x(n)-f(x(n))/f'(x(n))。 牛顿迭代法又称牛顿切线法,它采用以下方法求根:先任意设定一个与真实的根接近的值x 0作为第一个近似根,由x 0求出f(x 0),过(x 0,f(x 0))点做f(x)的切线,交x 轴于x 1,把它作为第二次近似根,再由x 1求出f(x 1),再过(x 1,f(x 1))点做f(x)的切线,交x 轴于x 2,再求出f(x 2),再作切线……如此继续下去,直到足够接近真正的x *为止。 ) ()()()(0' 0010 100' x f x f x x x x x f x f - =-= 因此, 就是牛顿迭代公式。 例1 用牛顿迭代法求方程2x 3-4x 2 +3x-6=0在1.5附近的根。 本题中,f(x)= 2x 3-4x 2+3x-6=((2x-4)x+3)x-6 f ’(x)= 6x 2-8x+3=(6x-8)x+3 #include "stdio.h"

matlab程序设计实践-牛顿法解非线性方程

中南大学MATLAB程序设计实践学长有爱奉献,下载填上信息即可上交,没有下载券的自行百度。所需m文件照本文档做即可,即新建(FILE)→脚本(NEW-Sscript)→复制本文档代码→运行(会跳出保存界面,文件名默认不要修改,保存)→结果。第一题需要把数据文本文档和m文件放在一起。全部测试无误,放心使用。本文档针对做牛顿法求非线性函数题目的同学,当然第一题都一样,所有人都可以用。←记得删掉这段话 班级: ? 学号: 姓名:

一、《MATLAB程序设计实践》Matlab基础 表示多晶体材料织构的三维取向分布函数(f=f(φ1,φ,φ2))是一个非常复杂的函数,难以精确的用解析函数表达,通常采用离散 空间函数值来表示取向分布函数,是三维取向分布函数的一个实例。 由于数据量非常大,不便于分析,需要借助图形来分析。请你编写一 个matlab程序画出如下的几种图形来分析其取向分布特征: (1)用Slice函数给出其整体分布特征; " ~ (2)用pcolor或contour函数分别给出(φ2=0, 5, 10, 15, 20, 25, 30, 35 … 90)切面上f分布情况(需要用到subplot函数);

(3) 用plot函数给出沿α取向线(φ1=0~90,φ=45,φ2=0)的f分布情况。 (

备注:数据格式说明 解: (1)( (2)将文件内的数据按照要求读取到矩阵f(phi1,phi,phi2)中,代码如 下: fid=fopen(''); for i=1:18 tline=fgetl(fid); end phi1=1;phi=1;phi2=1;line=0; f=zeros(19,19,19); [ while ~feof(fid) tline=fgetl(fid); data=str2num(tline); line=line+1;数据说明部分,与 作图无关此方向表示f随着 φ1从0,5,10,15, 20 …到90的变化而 变化 此方向表示f随着φ 从0,5,10,15, 20 … 到90的变化而变化 表示以下数据为φ2=0的数据,即f(φ1,φ,0)

Newton迭代法求解非线性方程

Newton迭代法求解非 线性方程

一、 Newton 迭代法概述 构造迭代函数的一条重要途径是用近似方程来代替原方程去求根。因此,如果能将非线性方程f (x )=0用线性方程去代替,那么,求近似根问题就很容易解决,而且十分方便。牛顿(Newton)法就是一种将非线性方程线化的一种方法。 设k x 是方程f (x )=0的一个近似根,把如果)(x f 在k x 处作一阶Taylor 展开,即: )x x )(x ('f )x (f )x (f k k k -+≈ (1-1) 于是我们得到如下近似方程: 0)x x )(x ('f )x (f k k k =-+ (1-2) 设0)('≠k x f ,则方程的解为: x ?=x k +f (x k ) f (x k )? (1-3) 取x ~作为原方程的新近似根1+k x ,即令: ) x ('f ) x (f x x k k k 1k -=+, k=0,1,2,… (1-4) 上式称为牛顿迭代格式。用牛顿迭代格式求方程的根的方法就称为牛顿迭代法,简称牛顿法。 牛顿法具有明显的几何意义。方程: )x x )(x ('f )x (f y k k k -+= (1-5) 是曲线)x (f y =上点))x (f ,x (k k 处的切线方程。迭代格式(1-4)就是用切线式(1-5)的零点来代替曲线的零点。正因为如此,牛顿法也称为切线法。 牛顿迭代法对单根至少是二阶局部收敛的,而对于重根是一阶局部收敛的。一般来说,牛顿法对初值0x 的要求较高,初值足够靠近*x 时才能保证收敛。若

要保证初值在较大范围内收敛,则需对)x (f 加一些条件。如果所加的条件不满足,而导致牛顿法不收敛时,则需对牛顿法作一些改时,即可以采用下面的迭代格式: ) x ('f ) x (f x x k k k 1k λ -=+, ?=,2,1,0k (1-6) 上式中,10<λ<,称为下山因子。因此,用这种方法求方程的根,也称为牛顿下山法。 牛顿法对单根收敛速度快,但每迭代一次,除需计算)x (f k 之外,还要计算 )x ('f k 的值。如果)x (f 比较复杂,计算)x ('f k 的工作量就可能比较大。为了避免计算导数值,我们可用差商来代替导数。通常用如下几种方法: 1. 割线法 如果用 1 k k 1k k x x ) x (f )x (f ----代替)x ('f k ,则得到割线法的迭代格式为: )x (f ) x (f )x (f x x x x k 1k k 1 k k k 1k --+---= (1-7) 2. 拟牛顿法 如果用 ) x (f )) x (f x (f )x (f k 1k k k ---代替)x ('f k ,则得到拟牛顿法的迭代格式为: )) x (f x (f )x (f ) x (f x x 1k k k k 2k 1k -+--- = (1-8) 3. Steffenson 法 如果用 ) x (f ) x (f ))x (f x (f k k k k -+代替)x ('f k ,则得到拟牛顿法的迭代格式为: ) x (f ))x (f x (f ) x (f x x k k k k 2k 1 k -+- =+

用牛顿迭代法求解非线性方程

数值分析实验报告(一) 实验 名称 用牛顿迭代法求解非线性方程实验时间2011年11 月19日姓名班级学号成绩 一、实验目的 1.了解求解非线性方程的解的常见方法。 2.编写牛顿迭代法程序求解非线性方程。 二、实验内容 分别用初值 0.01 x=, 10 x=和 300 x=求113,要求精度为5 10-。 三、实验原理 设113 x=,则21130 x-=,记f(x)= 2113 x-,问题便成为了求2x -113=0的正根; 用牛顿迭代公式得 2 1 113 2 k k k k x x x x + - =-,即 1 1113 () 2 k k k x x x + =+(其中k=0,1,2,3,…,) 简单推导 假设f(x)是关于X的函数: 求出f(x)的一阶导,即斜率: 简化等式得到: 然后利用得到的最终式进行迭代运算直至求到一个比较精确的满意值。 如果f函数在闭区间[a,b]内连续,必存在一点x使得f(x) = c,c是函数f在闭区间[a,b]内的一点 我们先猜测一X初始值,然后代入初始值,通过迭代运算不断推进,逐步靠近精确值,直到得到我们主观认为比较满意的值为止。 回到我们最开始的那个”莫名其妙”的公式,我们要求的是N的平方根,令x2 = n,假设一关

于X的函数f(x)为: f(X) = X2 - n 求f(X)的一阶导为: f'(X) = 2X 代入前面求到的最终式中: X k+1 = X k - (X k 2 - n)/2X k 化简即得到我们最初提到求平方根的迭代公式: 四、实验步骤 1.根据实验题目,给出题目的C程序。 当初值为0.01、10、300时,即x=0.01,10,300 分别应用程序: #include "stdio.h" int main() { float number; printf("Please input the number:"); scanf("%f", &number); float x=1; int i; for (i=0;i<1000;i++) { x = (x + number/x)/2; } printf("The square root of %f is %8.5f\n", number ,x); } 得出结果 2.上机输入和调试自己所编的程序。 当x=0.01时,结果为:10.63015 x=10时,结果为:10.63015 x=300时,结果也为:10.63015 3.实验结果分析。 当初值取0.01、10、300时取不同的初值得到同样的结果10.63015。 五、程序

牛顿迭代法求方程的根

利用迭代算法解决问题,需要做好以下三个方面的工作: 一、确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。 二、建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。 三、对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。 最经典的迭代算法是欧几里德算法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理: 牛顿迭代法是牛顿在17世纪提出的一种求解方程f(x)=0.多数方程不存在求根公式,从而求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。 设r是f(x)=0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y=f(x)的切线L,L的方程为y=f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标x1=x0-f(x0)/f'(x0),称x1为r的一次近似值,过点(x1,f(x1))做曲线y=f(x)的切线,并求该切线与x轴的横坐标 x2=x1-f(x1)/f'(x1)称x2为r的二次近似值,重复以上过程,得r 的近似值序列{Xn},其中Xn+1=Xn-f(Xn)/f'(Xn),称为r的n+1次近似值。上式称为牛顿迭代公式。 /* 用牛顿迭代法求下面方程 x*x*x-5*x*x+16*x-80=0的实根的过程是:

c++求解非线性方程组的牛顿顿迭代法

牛顿迭代法c++程序设计 求解{0=x*x-2*x-y+0.5; 0=x*x+4*y*y-4; }的方程 #include #include #define N 2 // 非线性方程组中方程个数、未知量个数 #define Epsilon 0.0001 // 差向量1范数的上限 #define Max 100 //最大迭代次数 using namespace std; const int N2=2*N; int main() { void ff(float xx[N],float yy[N]); //计算向量函数的因变量向量yy[N] void ffjacobian(float xx[N],float yy[N][N]);/ /计算雅克比矩阵yy[N][N] void inv_jacobian(float yy[N][N],float inv[N][N]); //计算雅克比矩阵的逆矩阵inv void newdundiedai(float x0[N], float inv[N][N],float y0[N],float x1[N]); //由近似解向量x0 计算近似解向量x1 float x0[N]={2.0,0.25},y0[N],jacobian[N][N],invjacobian[N][N],x1[N],errornorm; int i,j,iter=0; //如果取消对x0的初始化,撤销下面两行的注释符, 就可以由键盘向x0读入初始近似解向量for( i=0;i>x0[i]; cout<<"初始近似解向量:"<

利用牛顿迭代法求解非线性代数方程组

利用牛顿迭代法求解非线性代数方程组 一、 问题描述 在实际应用的很多领域中,都涉及到非线性方程组的求解问题。由于方程的非线性,给我们解题带来一定困难。牛顿迭代法是求解非线性方程组的有效方法。下面具体对牛顿迭代法的算法进行讨论,并通过实例理解牛顿迭代法。 二、 算法基本思想 牛顿迭代法求解非线性代数方程组的主要思想是将非线性函数线性化。下面我们具体讨论线性化过程: 令: ()()()()?? ?? ????????=????? ???????=????????????=0000,,2121 n n x x x x x f x f x f x F (3-1) 则非线性方程组(3-2) ()()()0 ,,,0 ,,,0,,,21212211===n n n n x x x f x x x f x x x f (3-2) 可写为向量形式 ()0=x F (3-3) ? ()0=x F 成为向量函数。

设()()() ()k n k k x x x ,,,2 1 是方程组(3-2)的一组近似解,把它的左端在()()() ()k n k k x x x ,,,2 1 处用多元函数的泰勒展式展开,然后取线性部分,便得方程组(3-2)得近似方程组 ()()() ( ) ()()() () ()()()() ( )()()() () ()()() () ( ) ()()() () ()0 ,,,,,,0 ,,,,,,0 ,,,,,,1 21211 2122121 211211=???+=???+=???+∑∑∑===k j n j k n k k n k n k k n k j n j k n k k k n k k k j n j k n k k k n k k x x x x x f x x x f x x x x x f x x x f x x x x x f x x x f (3-4) 这是关于()()()n i x x x k i i k i ,,2,1 =-=?的线性方程组,如果它的系数矩阵 ????????? ???????????????????????????????n n n n n n x f x f x f x f x f x f x f x f x f 2 1 2221 2121 11 (3-5) 非奇异,则可解得 () ()()???? ?? ? ???????---?????????? ??????????????????????????????=?????????????????-n n n n n n n k n k k f f f x f x f x f x f x f x f x f x f x f x x x 21 1 2 1 2221 2121 11 21 (3-6) 矩阵(3-5)称为向量函数()x F 的Jacobi 矩阵,记作()x F ' 。又记

牛顿迭代法在求解非线性方程重根问题中的研究

牛顿迭代法在求解非线性方程重根问题中的研究 摘要:牛顿迭代法是求解非线性方程的根的常用方法。在实际计算中往往会遇到重根情况,针对这种情况,我们在牛顿迭代法的理论基础上,探讨了三种不同的迭代格式。为了对比这三种方法,本文进行了两个实验,分别是含有重根的非线性方程求解问题实例和牛顿迭代法在求解购房按揭利率的应用实例。在分析运算结果后,得出了三种算法优势和劣势。 关键词:牛顿迭代法;MA TLAB;重根 Abstract:Newton iteration method is a common method to solve the roots of nonlinear equations. In order to solve this problem, we discuss three different iteration schemes based on Newton iteration method. In order to compare the three methods, two experiments are carried out in this paper, one is the solving of nonlinear equations with heavy roots, and the other is the application of Newton iteration method in solving house mortgage interest rate. The advantages and disadvantages of three algorithms are obtained after analyzing the results. Key words:Newton iterative method;MA TLAB;Root weight

用牛顿迭代法求解近似根

第四题 题目:用Newton 法求方程在 74 28140x x -+= (0.1,1.9)中的近似根(初始近似值取为区间端点,迭代6次或误差小于0.00001). 解:此题是用牛顿迭代法求解近似根的问题 1. Newton 迭代法的算法公式及应用条件: 设函数在有限区间[a,b]上二阶导数存在,且满足条件 ⅰ. ()()0f a f b <; ⅱ. ()''f x 在区间[a,b]上不变号; ⅲ. ()'0f x ≠; ⅳ. ()()'f c f c b a ≤-,其中c 是a,b 中使()()''min(,)f a f b 达到的一个. 则对任意初始近似值0[,]x a b ∈,由Newton 迭代过程 ()()() 1'k k k k k f x x x x f x +=Φ=-,k=0,1,2… 所生成的迭代序列{ k x }平方收敛于方程()0f x =在区间[a,b]上的唯一解а. 对本题: )9.1()9.1(0 )8(4233642)(0 )16(71127)(0 )9.1(,0)1.0(,1428)(3225333647>?''<-=-=''<-=-='<>+-=f f x x x x x f x x x x x f f f x x x f Θ 故以1.9为起点 ?? ???='-=+9.1)()(01x x f x f x x k k k k 2. 程序编写 #include #include void main() { double x0,x=1.9; do

{ x0=x; x=x0-(x0*x0*x0*x0*x0*x0*x0-28*x0*x0*x0*x0+14)/(7*x0*x0*x0*x0*x0*x0-28*4*x0*x0 *x0); } while(fabs(x-x0)>1e-5); printf("x=%f",x); } 3.打印结果 4.讨论分析 A.要用误差范围来控制循环的次数,保证循环的次数和质量。 B.编写程序过程中要注意标点符号的使用,正确运用适当的标点符号。C.Newton迭代法是局部收敛的,在使用时应先确定初始值。

基于Matlab的牛顿迭代法解非线性方程组

基于Matlab 实现牛顿迭代法解非线性方程组 已知非线性方程组如下 2211221212 10801080x x x x x x x ?-++=??+-+=?? 给定初值0(0,0)T x =,要求求解精度达到0.00001 首先建立函数F(x),方程组编程如下,将F.m 保存到工作路径中: function f=F(x) f(1)=x(1)^2-10*x(1)+x(2)^2+8; f(2)=x(1)*x(2)^2+x(1)-10*x(2)+8; f=[f(1) f(2)]; 建立函数DF(x),用于求方程组的Jacobi 矩阵,将DF.m 保存到工作路径中: function df=DF(x) df=[2*x(1)-10,2*x(2);x(2)^2+1,2*x(1)*x(2)-10]; 编程牛顿迭代法解非线性方程组,将newton.m 保存到工作路径中: clear; clc x=[0,0]'; f=F(x); df=DF(x); fprintf('%d %.7f %.7f\n',0,x(1),x(2)); N=4; for i=1:N y=df\f'; x=x-y; f=F(x); df=DF(x); fprintf('%d %.7f %.7f\n',i,x(1),x(2)); if norm(y)<0.0000001 break ; else end end

运行结果如下: 0 0.0000000 0.0000000 1 0.8000000 0.8800000 2 0.9917872 0.9917117 3 0.9999752 0.9999685 4 1.0000000 1.0000000

Newton 法解非线性方程组

Newton法解非线性方程组 一.题目重述:编程实现非线性方程组的牛顿解法,并求解如下方程组。 3x1?cos x2x3?0.5=0 x12?81x2+0.12+sin x3+1.06=0 e?x1x2+20x3+10π?3 3 =0 二.算法: 非线性方程组的牛顿法为:给定初始解向量x(0),对于k≥1生成 x(k)=x(k?1)?J x k?1?1F(x(k?1)). 三.编程实现: 这里用MATLAB程序实现,建立三个文件如下: 1.函数F(X)文件 function F =F( X) F(1,1)=3*X(1)-cos(X(2)*X(3))-0.5; F(2,1)=X(1)^2-81*(X(2)+0.1)^2+sin(X(3))+1.06; F(3,1)=exp(-X(1)*X(2))+20*X(3)+(10*pi-3)/3; end 2.J(X) 函数(即Jacobian矩阵)文件 function F1= F1(X ) F1(1,:)=[3,sin(X(1)*X(2))*X(3),sin(X(1)*X(2))*X(2)]; F1(2,:)=[2*X(1),-162*(X(2)+0.1),cos(X(3))]; F1(3,:)=[exp(-X(1)*X(2))*(-X(2)),exp(-X(1)*X(2))*(-X(1)),20]; end 3.解题脚本文件 文件名zu %% 牛顿法解非线性方程组 clear; X0=[0.1;0.1;-0.1]; for i=1:200 X=X0-F1(X0)\F(X0); %这里采用MATLAB的左除方法,避免算逆矩阵X0=X; end X

牛顿法解非线性方程组实验报告

实验名称: 牛顿法解非线性方程组 1 引言 我们已经知道,线性方程组我们可以采取Jacobi 迭代法,G-S 迭代法以及SOR 迭代方法求解。而在科学技术领域里常常提出求解非线性方程组的问题,例如,用非线性函数拟合实验数据问题、非线性网络问题,用差分法求解非线性微分方程问题等。 我们在解非线性方程组时,也考虑用迭代法求解,其思路和解非线性方程式一样,首先要将F(x)=0转化为等价的方程组 12(,,,),(1,2, )i i n x g x x x i n == 或者简记为x =g (x ),其中:,:n n n i g R R g R R →→ 112 2()()(),()n n n g x g x g R g x ???? ????????==∈???? ???????????? x x x x x 迭代法:首先从某个初始向量(0)x 开始,按下述逐次代入方法构造一向量序列(){}k x : (1)()() 1(,,),(1,2,,)k k k i i n x g x x i n +== 其中,()()() ()12 (,,,)k k k k T n x x x =x 。 或写成向量形式:(1)()(),(0,1,2,)k k g k +==x x 如果()*lim k k →∞ ≡x x (存在),称(){}k x 为收敛。且当()i g x 为连续函数时,可得 *()*(lim )()k k g g →∞ ==x x x 说明*x 为方程组的解。又称为x =g (x )的不动点。 本实验中采用牛顿迭代法来求解非线性方程组。 2 实验目的和要求 运用matlab 编写一个.m 文件,要求用牛顿法非线性方程组: 12(0)(1)()3211 cos 02,(取(0,0),要求10)1sin 0 2 T k k x x x x x x x +-∞ ?-=??=-

相关文档
最新文档