MATLAB用二分法、不动点迭代法及Newton迭代(切线)法求非线性方程的根

作者:凯鲁嘎吉 - 博客园
http://www.cnblogs.com/kailugaji/

一、实验原理

二、实验步骤

三、实验过程

1.(程序)

(1)二分法:求   在区间(1,2)之间的根,取

(a)bipart.m:

function [x,m]=bipart(fun,a0,b0,tol)
a=a0;b=b0;
m=1+round(round(log((b-a)/tol))/log(2));
for k=1:m
p=(a+b)/2;
if fun(p)*fun(b)<0
a=p;
else
b=p;
end
x=p;
end 

(b)fun1.m:

function f=fun1(x)
f=x^3+10*x-20;

(2)不动点迭代法:求方程附近的根,取

(a)budong.m:

function [x,k]=budong(fun,x0,tol,m)
for k=1:m
x=fun(x0);
if abs(x-x0)<tol
break;
end
x0=x;
end
x=vpa(x,8);

(b)fun.m

function t=fun(x1)
syms x;
f=x^3-2*x-5;
s=subs(diff(f,x),x,x1);
x=x1;
f=x^3-2*x-5;
t=x-f/s;

(3)牛顿迭代法:求方程附近的根,取

newton.m:

function x1=newton(t1,esp,m)

syms x;

fun=x^3+2*x-5;

for k=1:m

    if abs(subs(diff(fun,'x'),x,t1))<esp

        x1=t1;

        break;

    else

        if subs(diff(fun,'x',2),x,t1)==0

            break;

            disp('解题失败!')

        else

            t0=t1;

            t1=t0-subs(fun,x,t0)/subs(diff(fun,'x'),x,t0);

            if abs(t1-t0)<esp

                x1=t1;

                break;

            end

        end

    end

end

x1=vpa(x1,8);

2.(运算结果)

(1)二分法:

>> [x,m]=bipart(@fun1,1,2,0.0001)
x =
1.5945
m =
14

(2)不动点迭代法:

>> [x,k]=budong(@fun,2,1e-5,100)
x =
2.0945515
k =
4

(3)牛顿迭代法:

 >> x1=newton(2,1e-4,20)
x1 =
1.3282689
 

3.(拓展(方法改进、体会等))

对于方程的根为重根的情形,newton法求重根只是线性收敛,迭代缓慢,如果对于求重根的情形,对newton法进行改进,取

 ,

。用迭代法

求m重根,则具有二阶收敛性,但要知道的重数m。

计算方程的根是二重根,用newton法与改进方法求根。

源程序:

newton_biroot.m:

function t=newton_biroot(x1)

syms x;

f=x^4-4*(x^2)+4;

s=subs(diff(f,x),x,x1);

x=x1;

f=x^4-4*(x^2)+4;

t=x-f/s;

biroot1.m:

function t=biroot1(x1)

syms x;

f=x^4-4*(x^2)+4;

s=subs(diff(f,x),x,x1);

x=x1;

f=x^4-4*(x^2)+4;

t=x-2*f/s;

budong.m:

function [x,k]=budong(fun,x0,tol,m)

for k=1:m

    x=fun(x0);

    if abs(x-x0)<tol

        break;

    end

    x0=x;

    x=vpa(x,8)

end

x=vpa(x,8);

运行结果:取初值为2

k

          xk

newton法

改进方法

1

          x1

1.75

1.5

2

          x2

1.5982143

1.4166667

3

          x3

1.5115099

1.4142157

4

          x4

1.4644275

1.4142157

计算4步,改进方法就已经收敛,而newton法只是线性收敛,要达到同样精度需迭代17次。

附结果:

>> [x,k]=budong(@biroot1,2,1e-5,3)

x =

1.5

x =

1.4166667

x =

1.4142157

x =

1.4142157

k =

3

>> [x,k]=budong(@biroot1,2,1e-5,10)

x =

1.5

x =

1.4166667

x =

1.4142157

x =

1.4142136

k =

4

>> [x,k]=budong(@newton_biroot,2,1e-5,50)

x =

1.75

x =

1.5982143

x =

1.5115099

x =

1.4644275

x =

1.439751

x =

1.4270955

x =

1.4206836

x =

1.4174559

x =

1.4158366

x =

1.4150256

x =

1.4146197

x =

1.4144166

x =

1.4143151

x =

1.4142643

x =

1.414239

x =

1.4142263

x =

1.4142199

k =

17

MATLAB用二分法、不动点迭代法及Newton迭代(切线)法求非线性方程的根的更多相关文章

  1. 七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)

    http://blog.csdn.net/xw20084898/article/details/17564957 一.工具:VC+OpenCV 二.语言:C++ 三.原理 otsu法(最大类间方差法, ...

  2. 【转】七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)

    http://blog.csdn.net/xw20084898/article/details/17564957 一.工具:VC+OpenCV 二.语言:C++ 三.原理 otsu法(最大类间方差法, ...

  3. 牛顿迭代法(Newton's method)

    关键词:牛顿法.牛顿迭代法.牛顿切线法.牛顿-拉弗森方法 参考:牛顿迭代法-百度百科.牛顿切线法-百度文库数学学院.牛顿切线法数值分析.非线性方程(组)的数值解法.Latex入门 https://bl ...

  4. matlab运行出现“变量似乎会随着迭代次数改变而变化,请预分配内存,以提高运行速度”问题

    这句话大致意思就是: b = 0;for i = 1:3    a(i) = b;end是说变量的长度是变化的,经常在循环里出现,比如上面这个例子,这样会影响计算速度,最好的办法是预先定义a的长度,比 ...

  5. 【图像算法】七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)

    图像算法:图像阈值分割 SkySeraph Dec 21st 2010  HQU Email:zgzhaobo@gmail.com    QQ:452728574 Latest Modified Da ...

  6. 【清橙A1094】【牛顿迭代法】牛顿迭代法求方程的根

    问题描述 给定三次函数f(x)=ax3+bx2+cx+d的4个系数a,b,c,d,以及一个数z,请用牛顿迭代法求出函数f(x)=0在z附近的根,并给出迭代所需要次数. 牛顿迭代法的原理如下(参考下图) ...

  7. matlab练习程序(对应点集配准的四元数法)

    这个算是ICP算法中的一个关键步骤,单独拿出来看一下. 算法流程如下: 1.首先得到同名点集P和X. 2.计算P和X的均值up和ux. 3.由P和X构造协方差矩阵sigma. 4.由协方差矩阵sigm ...

  8. 牛顿迭代,多项式求逆,除法,开方,exp,ln,求幂

    牛顿迭代 若 \[G(F_0(x))\equiv 0(mod\ x^{2^t})\] 牛顿迭代 \[F(x)\equiv F_0(x)-\frac{G(F_0(x))}{G'(F_0(x))}(mod ...

  9. C语言之基本算法25—牛顿迭代法求方程近似根

    //牛顿迭代法! /* ============================================================ 题目:用牛顿迭代法求解3*x*x*x-2*x*x-16 ...

随机推荐

  1. 解决Windows英文版中文软件乱码的问题

    由于工作的原因,我们的开发环境都是基于英文的,但是在打开一些基于中文编码的软件的时候经常会出现乱码的情况.其实只要打开控制面板按照下面的步骤稍微设置一下,就可以完美的在英文操作系统下支持中文软件了,因 ...

  2. leetcode — string-to-integer-atoi

    /** * Source : https://oj.leetcode.com/problems/string-to-integer-atoi/ * * Created by lverpeng on 2 ...

  3. 第一个Quartz程序 (二)

    1 我们使用maven项目 2 创建一个job类,在execute()方法里写上业务逻辑代码. 3 在另外一个类中创建触发器,调度器,并且绑定job. 首先在项目的pom.xml引入需要的jar包. ...

  4. Asp.net mvc 5 CRUD代码自动生成工具- vs.net 2013 Saffolding功能扩展

    Asp.net mvc 5 CRUD代码自动生成工具 -Visual Studio.net2013 Saffolding功能扩展 上次做过一个<Asp.net webform scaffoldi ...

  5. lightswitch Grid 控件添加 CheckBox 多选

    ACTIVATING MULTI SELECTION WITH CHECKBOXES IN A LIGHTSWITCH GRID WITH A ONE-LINER 2013/04/02 · by pa ...

  6. Django组件之cookie与session

    一.引子 http协议是无状态的,就是它不会记录请求和响应的任何信息,比如你访问一个服务器的一个网页时,先要你登录一下,然后进入网页,但当你要进入这个服务器的另一个网页时,它照常不会知道刚才你已经登录 ...

  7. S5PV210 串口实验(中断方式)

    结合之前的串口实验(轮询方式)与中断体系分析,我们来做下中断方式的串口接收实验. start.S .global _start .global IRQ_handle _start: /* 关 Watc ...

  8. AJAX 基本结构 数据加载

    AJAX -- 网页数据异步加载 .ashx 一般处理程序   json 数据格式,在不同的语言之间传递数据 对象格式:     "{"key":"value& ...

  9. win10 管理工具中添加 oracle 10g驱动

    重装了系统,在应用oracle 10g时,一直在管理工具中没有添加成功ODBC驱动,今天找到解决方法了. 状态如下: 解决方法: c盘——windows——SysWOW64——odbcad32.exe ...

  10. ArrayList 原码解析

    基于java1.71.ArrayList 是基于数组实现的 通过源码 我们可以知道 ArrayList 提供了三种构造器用于实例化 /** * Constructs an empty list wit ...