从泰勒展开到牛顿迭代

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.泰勒公式(Taylor’s Formula)

对于一些复杂的函数,为了方便研究与分析,我们往往希望用一些简单的函数来近似表达。其实这也符合人们对事物的认知规律与认知曲线:有浅入深,由易到难,前面研究的比较容易的部分往往是后面推广结论的特例。在比较简单的函数中,多项式算是最简单的一种了。因为多项表达式只有比较简单的加减乘除四则运算,便能求出函数的值。所以,用多项式表达复杂函数往往是我们的首选。

给出泰勒公式的具体表达式:
如果函数 f ( x ) f(x) f(x)在含有 x 0 x_0 x0的某个开区间 ( a , b ) (a,b) (a,b)内具有 ( n + 1 ) (n+1) (n+1)阶的导数,那么对任一 x ∈ ( a , b ) x \in (a,b) x(a,b),有
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + f ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 + ⋯ + f ( n ) ( x 0 ) n ! ( x − x 0 ) n + R n ( x ) f(x) = f(x_0) + f'(x_0)(x-x_0) + \frac{f''(x_0)}{2!}(x-x_0)^2 + \cdots + \frac{f^{(n)}(x_0)}{n!}(x-x_0)^n + R_n(x) f(x)=f(x0)+f(x0)(xx0)+2!f(x0)(xx0)2++n!f(n)(x0)(xx0)n+Rn(x)

其中 R n ( x ) = f ( n + 1 ) ( ϵ ) ( n + 1 ) ! ( x − x 0 ) ( n + 1 ) R_n(x) = \frac{f^{(n+1)}(\epsilon)}{(n+1)!}(x-x_0)^{(n+1)} Rn(x)=(n+1)!f(n+1)(ϵ)(xx0)(n+1)
这里的 ϵ \epsilon ϵ是介于 x x x x 0 x_0 x0之间的某个值, R n R_n Rn被称为拉格朗日余项。

泰勒公式的初衷是用多项式来近似表示函数在某点周围的情况。取最常见的 e x e^x ex为例,在 x = 0 x=0 x=0的附近可以用如下多项式近似表示:
e x ≈ 1 + x + x 2 2 ! + x 3 3 ! + ⋯ + x n n ! e^x \approx 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \cdots + \frac{x^n}{n!} ex1+x+2!x2+3!x3++n!xn

2.麦克劳林级数(Maclaurin)

通过函数在自变量零点的导数求得的泰勒级数又叫麦克劳林级数。以前面提到的 e x e^x ex为例,麦克劳林级数即为
e x ≈ 1 + x + x 2 2 ! + x 3 3 ! + ⋯ + x n n ! e^x \approx 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \cdots + \frac{x^n}{n!} ex1+x+2!x2+3!x3++n!xn

3.泰勒展开的小结

1.泰勒公式的核心思想就是:用多项式函数取逼近光滑的函数。注意这里光滑很重要,因为泰勒公式里面要求具有 ( n + 1 ) (n+1) (n+1)阶的导数,如果函数“不光滑”,显然不会满足上面的条件。
2.泰勒公式最常见的应用之一就是用于近似计算。以 s i n ( x ) sin(x) sin(x)为例:
s i n ( x ) = x − 1 3 ! x 3 + 1 7 ! x 7 − 1 9 ! x 9 + ⋯ sin(x) = x - \frac{1}{3!}x^3 + \frac{1}{7!}x^7 - \frac{1}{9!}x^9 + \cdots sin(x)=x3!1x3+7!1x79!1x9+
计算机中计算 s i n ( x ) sin(x) sin(x)的值,就可以用上面的公式计算。

4.牛顿法(Newton’s method)

牛顿法(Newton’s method)又称为牛顿-拉弗森方法(Newton-Raphson method)。本博主的master论文里主要的理论依据就是牛顿-拉弗森方法。它是一种在实数域和复数域上近似求解方程的方法。牛顿法使用函数 f ( x ) f(x) f(x)的泰勒级数的前面几项来寻找方程 f ( x ) = 0 f(x)=0 f(x)=0的根。所以他跟泰勒展开有天然的关系。

有前面的泰勒展开
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + f ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 + ⋯ + f ( n ) ( x 0 ) n ! ( x − x 0 ) n + R n ( x ) f(x) = f(x_0) + f'(x_0)(x-x_0) + \frac{f''(x_0)}{2!}(x-x_0)^2 + \cdots + \frac{f^{(n)}(x_0)}{n!}(x-x_0)^n + R_n(x) f(x)=f(x0)+f(x0)(xx0)+2!f(x0)(xx0)2++n!f(n)(x0)(xx0)n+Rn(x)

取泰勒展开的一次项,忽略后面的高次项,有:
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) f(x) = f(x_0) + f'(x_0)(x-x_0) f(x)=f(x0)+f(x0)(xx0)
如果我们将得到的新的坐标为 x n + 1 x_{n+1} xn+1,原来的坐标为 x n x_n xn,通常 x n + 1 x_{n+1} xn+1 x n x_n xn更接近方程 f ( x ) = 0 f(x)=0 f(x)=0的解。因此利用新的坐标为 x n + 1 x_{n+1} xn+1进行下一轮迭代。

由上面的式子,很容易得出迭代公式为:
x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)} xn+1=xnf(xn)f(xn)
用此式迭代,即可得到方程 f ( x ) = 0 f(x)=0 f(x)=0的根。

牛顿迭代的几何意义如下图
这里写图片描述

5.牛顿迭代实例

http://blog.csdn.net/bitcarmanlee/article/details/52194255 一文中,我们提到用牛顿迭代求解一个数的方根。里面我们给出了迭代公式,但是没有给出具体的推导过程。这里我们就推导一下求解方根迭代公式的过程。
n n n的方根,即求解 x 2 − n = 0 x^2-n=0 x2n=0
f ( x ) = x 2 − n f(x) = x^2 - n f(x)=x2n,则 f ′ ( x ) = 2 x f'(x) = 2x f(x)=2x
根据前面求得的牛顿迭代公式:
x ( n + 1 ) = x n − f ( x ) f ′ ( x ) = x n − x n 2 − n 2 x n = 1 2 ( x n + n x n ) x_{(n+1)} = x_n - \frac{f(x)}{f'(x)} = x_n - \frac{x_n^2-n}{2x_n} = \frac{1}{2}(x_n + \frac{n}{x_n}) x(n+1)=xnf(x)f(x)=xn2xnxn2n=21(xn+xnn)

result = 0.5 * (result + (n / result))

这行代码即由上述迭代公司所求得。

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 泰勒展开牛顿迭代是一种常用的数值计算方法,用于求解非线性方程的根。在Matlab中,可以使用循环结构来实现该算法。 首先,我们定义一个函数来表示需要求根的方程,假设为f(x)。然后,选择一个初始猜测值x0,并令x=x0。此后,通过泰勒展开牛顿迭代公式,可以得到下一个近似解x1的表达式,如下所示: x1 = x - f(x)/f'(x) 其中,f'(x)表示f(x)的一阶导数。 接下来,我们使用循环来迭代计算,直到满足指定的终止条件。一种常见的终止条件是设定一个最大迭代次数,或者当相邻两次迭代结果的差值小于某个阈值时停止。 下面是一个使用Matlab实现泰勒展开牛顿迭代的简单例子: ```matlab % 定义方程函数 f = @(x) cos(x) - x; % 定义方程函数的一阶导数 df = @(x) -sin(x) - 1; % 设置初始猜测值和终止条件 x0 = 0.5; maxIter = 100; tol = 1e-6; % 迭代计算 for iter = 1:maxIter x1 = x0 - f(x0)/df(x0); % 判断终止条件 if abs(x1 - x0) < tol || abs(f(x1)) < tol break; end x0 = x1; end % 输出迭代结果 disp(['迭代次数:', num2str(iter)]); disp(['迭代结果:', num2str(x1)]); ``` 在该程序中,我们使用cos(x) - x = 0作为需要求根的方程,通过迭代计算,找到了一个近似的根。 泰勒展开牛顿迭代是一种强大的数值计算方法,可以用于求解各种类型的非线性方程。当然,对于不同的方程,其迭代过程和求解结果可能有所不同,需要根据具体情况进行调整。 ### 回答2: 泰勒展开牛顿迭代是求解非线性方程的一种方法,可以通过泰勒级数的近似来逼近方程的根。以下是使用Matlab编写的简单实例程序: 1. 首先,定义函数f(x),表示要求解的非线性方程。例如,假设我们求解方程x^2 - 3 = 0,可以定义函数为f(x) = x^2 - 3。 2. 然后,定义函数f_derivative(x),表示函数f(x)的导数。假设我们求解的方程的导数为2x,可以定义函数为f_derivative(x) = 2x。 3. 接下来,定义牛顿迭代的函数newton_iter(x0),其中x0是初始猜测值。在每一次迭代中,使用泰勒级数展开近似函数的根,并更新当前的猜测值x。 ``` function [root, iterations] = newton_iter(x0) max_iterations = 100; tolerance = 1e-6; iterations = 0; while iterations < max_iterations iterations = iterations + 1; fval = f(x0); f_derivative_val = f_derivative(x0); delta_x = fval / f_derivative_val; x = x0 - delta_x; if abs(x - x0) < tolerance root = x; return; end x0 = x; end error('达到最大迭代次数但未找到解'); end ``` 4. 最后,调用函数newton_iter并给定初始猜测值x0,得到方程的近似根,并输出结果。 ``` x0 = 1; % 初始猜测值 [root, iterations] = newton_iter(x0); fprintf('方程的近似根为:%f\n', root); fprintf('迭代次数:%d\n', iterations); ``` 这样就可以使用Matlab编写一个简单的泰勒展开牛顿迭代的程序。请注意,实际的程序可能需要根据具体的方程进行修改和调整。 ### 回答3: 泰勒展开是一种数学方法,用来近似计算函数的值。而牛顿迭代是一种数值方法,用于解决方程或找到函数的根。在MATLAB中,可以将泰勒展开牛顿迭代结合起来实现更精确的数值计算。 假设我们要用泰勒展开来近似计算函数f(x)在某个点x0处的值,我们可以通过泰勒展开公式: f(x)=f(x0)+f'(x0)(x-x0)+f''(x0)/2!(x-x0)²+... 来完成近似计算。其中,f'(x0)表示函数f(x)在x0处的导数,f''(x0)表示函数f(x)在x0处的二阶导数,以此类推。 而牛顿迭代方法则是通过不断迭代逼近函数的根。假设我们要求解方程f(x)=0的根,首先选取一个初始近似值x0,然后通过牛顿迭代公式: x1 = x0 - f(x0)/f'(x0) x2 = x1 - f(x1)/f'(x1) ... 不断迭代,直到达到预定的精度要求。 在MATLAB中,可以编写一个函数,将泰勒展开牛顿迭代结合起来。首先定义函数f(x),然后计算其导数f'(x)和二阶导数f''(x),接着使用牛顿迭代公式进行迭代计算,直到满足精度要求为止。编写的程序类似如下: function result = newton_method(x0, epsilon) x = x0; while abs(f(x)) > epsilon x = x - f(x)/f_prime(x); end result = x; end 其中epsilon表示预设的精度要求。这个程序会返回近似的根。 总之,泰勒展开牛顿迭代是两种数值计算方法,通过结合它们可以在MATLAB中实现更精确的数值计算。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值