方程数值求解

下面几讲,我们将聚集如下方程的解法:

\begin{equation}

f(x)=0

\tag{3.1}\label{3.1}

\end{equation}

在微积分课程中,我们知道,许多优化问题最终归结为求解上述形式的方程,其中\(f\)为你要求极值的函数\(F\)的导数。在工程问题中,函数\(F\)来源多种多样,有公式、微分方程的解、实验和模拟等。

牛顿迭代

我们把方程\eqref{3.1}的解记为\(x^\*\)。方程的解法有三种:对分法、割线法和牛顿法。这三种方法都需要猜测接近\(x^\*\)的初始值。

我们这里讨论牛顿法。牛顿法的基础是将函数在某点做线性化近似,即

\begin{equation}

f(x) \approx f(x_0) + f'(x_0)(x-x_0)

\tag{3.2}\label{3.2}

\end{equation}

我们要求出满足\(f(x)=0\)的\(x\),因此我们令上式左边\(f(x)\)为0,求出\(x\):

\begin{equation}

x\approx x_0-\frac{f(x_0)}{f'(x_0)}

\tag{3.3}\label{3.3}

\end{equation}

把所得\(x\)记为\(x_1\),将\(x_1\)带入上式,得\(x_2\),再将\(x_2\)带入上式,得\(x_3\),……,最后得数列\(\{x_0,x_1,x_2,\cdots\}\),数列满足如下关系

\begin{equation}

x_{i+1}\approx x_i-\frac{f(x_i)}{f'(x_i)}

\tag{3.4}\label{3.4}

\end{equation}

如果\(f(x)\)在\(x^\*\)附近没有特殊的奇异性,且\(x_0\)接近\(x^\*\),上述数列将很快收敛到\(x^\*\)。

循环:for ... end 语句

应用牛顿法,我们需要按照\eqref{3.4}式多次反复计算。这在程序中可由循环来实现。下面我们看一个for循环的简单例子:

function S = mysum (n)
% gives the sum of the first n integers
S = 0; % start at zero
% The loop :
for i = 1:n % do n times
S = S + i; % add the current integer
end % end of the loop

这个函数是为了计算前\(n\)个整数的和。在命令窗口运行这个函数

>> mysum(100)

得到从1加到100的和。

下面我们用for循环实现牛顿法。程序如下:

function x = mynewton (f,f1 ,x0 ,n)
% Solves f(x) = 0 by doing n steps of Newton ’s method starting at x0.
% Inputs : f -- the function , input as an inline
% f1 -- it ’s derivative , input as an inline
% x0 -- starting guess , a number
% n -- the number of steps to do
% Output : x -- the approximate solution
format long % prints more digits
format compact % makes the output more compact
x = x0; % set x equal to the initial guess x0
for i = 1:n % Do n times
x = x - f(x)/ f1(x) % Newton ’s formula , prints x too
end

在命令窗口,定义内联函数\(f(x)=x^3-5\):

>> f = inline('x.^3-5','x')

并定义其导数\(f1\):

>> f1 = inline('3*x.^2','x')

运行牛顿法,

>> mynewton(f,f1,2,4)
ans =
1.709975946676833

对这个函数应用牛顿法。方程的根是\(5^{1/3}\)。根据你运行的结果,评估一下,程序给出的结果与真实值相差多少?程序收敛,需要\(n\)最小为多少?

收敛

当\(f'(x^\*)\)为非零有限值,且\(x_0\)很接近\(x^\*\)时,牛顿法会很快收敛。下面我们看看啥时候会出问题。

对于\(f(x)=x^{1/3}\),可知\(x^\*=0\),\(f'(x^\*)=\infty\)。如果你依次输入和运行以下命令

>> f = inline('x^(1/3)','x')
>> f1= inline('x^(-2/3)/3','x')
>> mynewton(f,f1,0.1,10)

得到的结果为复数:

ans =
1.023999999999999e+02 - 1.617981985233248e-13i

再看一个例子,\(f(x)=x^2\),\(f'(x)=2x\),\(x^*=0\),\(f'(x^*)=0\),依次输入和运行如下命令:

>> f = inline('x^2','x')
>> f1 = inline('2*x','x')
>> mynewton(f,f1,1,10)

能得到结果,但是,收敛很慢。

>> mynewton(f,f1,1,10)
ans =
9.765625000000000e-04
>> mynewton(f,f1,1,100)
ans =
7.888609052210118e-31

如果初始值\(x_0\)与\(x^\*\)偏离太远,式\eqref{3.2}不成立,按式\eqref{3.4}迭代1次的结果\(x_1\)可能远离也可能接近方程的根\(x^\*\)。继续迭代下去,会出现两种情况:

  • \(x_n\)收敛到\(x^\*\)
  • 迭代发散,不会收敛到\(x^\*\)

练习

3.1 用牛顿法计算\(f(x)=x^5-7\),初值为\(x_0=2\)。保证程序收敛(结果不再变化),\(n\)最小为多少?计算误差和残量。误差和残量等于0吗?

3.2 考虑一球从2米高处下落,碰到一坚硬地面反弹,碰撞恢复系数为0.9。写一个注释良好的脚本程序,计算球与地面第\(n\)次碰撞时,球走过的路程。碰撞多少次后,球走过的距离不再变化。

3.3 对于函数$ f(x) = x^3 − 4\(,以\)x_0=2$为初值,用纸和计算器进行牛顿迭代,计算每次迭代的误差和相对误差。保留足够多的小数,以免错以为收敛。将结果填在表内。

Todd's Matlab讲义第3讲:牛顿法和for循环的更多相关文章

  1. Todd's Matlab讲义第4讲:控制误差和条件语句

    误差和残量 数值求解方程\(f(x)=0\)的根,有多种方法测算结果的近似程度.最直接的方法是计算误差.第\(n\)步迭代结果与真值\(x^\*\)的差即为第\(n\)步迭代的误差: \begin{e ...

  2. Todd's Matlab讲义第6讲:割线法

    割线法 割线法求解方程\(f(x)=0\)的根需要两个接近真实根\(x^\*\)的初值\(x_0\)和\(x_1\),于是得到函数\(f(x)\)上两个点\((x_0,y_0=f(x_0))\)和\( ...

  3. Todd's Matlab讲义第5讲:二分法和找根

    二分法和if ... else ... end 语句 先回顾一下二分法.要求方程\(f(x)=0\)的根.假设\(c = f(a) < 0\)和\(d = f(b) > 0\),如果\(f ...

  4. Todd's Matlab讲义第2讲:Matlab 编程

    Matlab也可以编程,可存为以.m为后缀的文件,称为M文件.M文件有两种:函数和脚本. 函数程序 点击新建图标,在打开的窗口里输入如下内容: function y = myfunc (x) y = ...

  5. Todd's Matlab讲义第1讲:向量,函数和作图

    向量 Matlab 中最基本的对象是矩阵,向量是特殊的矩阵.行向量是\(1\times n\)矩阵,列向量是\(m\times 1\)矩阵.输入如下行向量: >> v=[0 1 2 3] ...

  6. A-03 牛顿法和拟牛顿法

    目录 牛顿法和拟牛顿法 一.牛顿法详解 1.1 无约束最优化问题 1.2 牛顿法迭代公式 1.3 牛顿法和梯度下降法 二.牛顿法流程 2.1 输入 2.2 输出 2.3 流程 三.拟牛顿法简介 更新. ...

  7. 面试必杀技,讲一讲Spring中的循环依赖

    本系列文章: 听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configu ...

  8. 【原创】牛顿法和拟牛顿法 -- BFGS, L-BFGS, OWL-QN

    数据.特征和数值优化算法是机器学习的核心,而牛顿法及其改良(拟牛顿法)是机器最常用的一类数字优化算法,今天就从牛顿法开始,介绍几个拟牛顿法算法.本博文只介绍算法的思想,具体的数学推导过程不做介绍. 1 ...

  9. Matlab 之meshgrid, interp, griddata 用法和实例

    http://blog.sina.com.cn/s/blog_67f37e760101bu4e.html 实例结果http://wenku.baidu.com/link?url=SiGsFZIxuS1 ...

随机推荐

  1. 页面记载给绑定query的grid加filter

    功能名称:listDataAction 切入类型:before 事件名称:com.kingdee.bos.webframework.dynamic.event.view.WebListDataEven ...

  2. [iOS 图像处理相关]

    //使用CGImage获取并修改图片像素 #define Mask8(x) ( (x) & 0xFF ) #define R(x) ( Mask8(x) ) #define G(x) ( Ma ...

  3. python时间模块-time和datetime

    时间模块 python 中时间表示方法有:时间戳,即从1975年1月1日00:00:00到现在的秒数:格式化后的时间字符串:时间struct_time 元组. struct_time元组中元素主要包括 ...

  4. [Android]Volley源码分析(三)

    上篇看了关于Request的源码,这篇接着来看下RequestQueue的源码. RequestQueue类图:

  5. PHP之:PHP框架

    ThinkPHP - 国内PHP框架 http://www.thinkphp.cn/. OneThink-基于tp框架开发的CMS  (适于小项目) http://www.onethink.cn/. ...

  6. Python: sort,sorted,OrderedDict的用法

    Python: sort,sorted,OrderedDict的用法 from http://stqdd.com/archives/427 by 莫亚菜 python对容器内数据的排序有两种,一种是容 ...

  7. 复习---JS-Array 对象

    要开始做第一个js练习了.前面三个小题都是数组的.先来复习一下数组.如下是W3C上面的关于数组的内容. 之前笔记中的内容:http://www.cnblogs.com/lal-fighting/p/5 ...

  8. CentOS7 Mini安装Oracle(图形化安装)

    以下操作在root用户下进行 1.mini版centos7没有ifconfig指令,可以如下操作 [root@localhost ~]# yum upgrade [root@localhost ~]# ...

  9. 使用 Object.create 创建对象,super 关键字,class 关键字

    ECMAScript 5 中引入了一个新方法:Object.create().可以调用这个方法来创建一个新对象.新对象的原型就是调用 create 方法时传入的第一个参数: var a = {a: 1 ...

  10. 一个 Sql语句优化的问题- STATISTICS 统计信息

    前段时间,同事遇到一个 Sql语句的问题,一个列表分页功能响应在30 s以上,看数据库里面的数据条数,数据量也不大,相关字段的一些索引也都有,可就是慢.于是找出具体的sql 语句出来分析,分页功能主要 ...