泰勒展开与牛顿迭代小结

泰勒展开

当年,泰勒看到了一个奇妙的函数,要计算某个点的值十分困难,于是他想到:能不能构造一个类似的函数,但是容易求出某个点的值呢?

于是,他就发明出了泰勒展开,即对于函数 f ( x ) f(x) f(x),可以求出另一个用多项式表示函数 g ( x ) g(x) g(x),使得 g ( x ) g(x) g(x) 近似于 f ( x ) f(x) f(x)

怎么构造呢?泰勒想到,要让这两个函数近似,那么得有一个点是重合的吧,不妨假设为 x = 0 x=0 x=0 f ( x ) f(x) f(x) g ( x ) g(x) g(x) 重合,那么此时 g ( x ) = f ( 0 ) g(x)=f(0) g(x)=f(0)

这样还不够,要让后面也尽可能重合,于是要让他们在 0 0 0 点的一阶导数相同,即 f ′ ( 0 ) = g ′ ( 0 ) f'(0)=g'(0) f(0)=g(0)

同样的,如果让二阶导数也相同,那么重合率会更高,一直重复下去,一直延伸到某个 n n n 阶导也相同时,就能让 g ( x ) g(x) g(x) 拥有我们想要的精度了。

由于 g ( x ) g(x) g(x) 是个多项式的形式,即 g ( x ) = a 0 + a 1 x + a 2 x 2 + a 3 x 3 + . . . g(x)=a_0+a_1x+a_2x^2+a_3x^3+... g(x)=a0+a1x+a2x2+a3x3+...,所以 g ( x ) g(x) g(x) k k k 阶导等于 a k k ! a_kk! akk!,而它的 k k k 阶导要和 f ( 0 ) f(0) f(0) k k k 阶导相同,所以有 a k k ! = f k ( 0 ) a_kk!=f^k(0) akk!=fk(0),即 a k = f k ( 0 ) k ! a_k=\frac {f^k(0)} {k!} ak=k!fk(0),带入 g ( x ) g(x) g(x) 得到:
g ( x ) ≈ f ( 0 ) 0 ! + f 1 ( 0 ) 1 ! x + f 2 ( 0 ) 2 ! x 2 + f 3 ( 0 ) 3 ! x 3 + . . . + f n ( 0 ) n ! g(x)\approx\frac {f(0)} {0!}+\frac {f^1(0)} {1!}x+\frac {f^2(0)} {2!}x^2+\frac {f^3(0)} {3!}x^3+...+\frac {f^n(0)} {n!} g(x)0!f(0)+1!f1(0)x+2!f2(0)x2+3!f3(0)x3+...+n!fn(0)

如果无限展开下去,即 n n n 趋于 ∞ \infty 时,就可以将 ≈ \approx 换成 = = = 了。

并且,我们不一定要在 0 0 0 点展开,假设在 x 0 x_0 x0 处展开,那么就得到:
g ( x ) = f ( x 0 ) 0 ! + f 1 ( x 0 ) 1 ! ( x − x 0 ) + f 2 ( x 0 ) 2 ! ( x − x 0 ) 2 + f 3 ( x 0 ) 3 ! ( x − x 0 ) 3 + . . . g(x)=\frac {f(x_0)} {0!}+\frac {f^1(x_0)} {1!}(x-x_0)+\frac {f^2(x_0)} {2!}(x-x_0)^2+\frac {f^3(x_0)} {3!}(x-x_0)^3+... g(x)=0!f(x0)+1!f1(x0)(xx0)+2!f2(x0)(xx0)2+3!f3(x0)(xx0)3+...

这就是泰勒公式了。

牛顿迭代

这个东西是用来求一个函数 f ( x ) f(x) f(x) 的零点的,但是不一定求得出来,而且如果有多个零点的话,只能求出 1 1 1 个,但是多做几次说不定就能全部求出来。

具体的思想是这样的:先随便找一个 x x x,求出点 ( x , f ( x ) ) (x,f(x)) (x,f(x)) 处的切线方程,由于在这个点附近,切线近似于函数 f ( x ) f(x) f(x) 的图像,于是不妨直接考虑这条切线的根,然后以这个根作为下一次递归的 x x x,不断重复,就能不断逼近 f ( x ) f(x) f(x) 的根了,就像这样:
在这里插入图片描述
也有求不出来的,就像 f ( x ) = x 1 3 f(x)=x^{\frac 1 3} f(x)=x31,无论从哪个位置出发,一定会不断远离零点:
在这里插入图片描述
对于当前位置 x x x,考虑求出下一个位置 x ′ x' x。由于点 ( x , f ( x ) ) (x,f(x)) (x,f(x)) 处的切线斜率为 f ′ ( x ) f'(x) f(x),所以 x ′ = x − f ( x ) f ′ ( x ) x'=x-\dfrac {f(x)} {f'(x)} x=xf(x)f(x)

而对于函数 f ( x ) = x 1 3 f(x)=x^{\frac 1 3} f(x)=x31,由于 f ′ ( x ) = 1 3 x − 2 3 f'(x)=\dfrac 1 3 x^{-\frac 2 3} f(x)=31x32,所以 x ′ = x − x 1 3 1 3 x − 2 3 = x − 3 x 1 3 − ( − 2 3 ) = x − 3 x = − 2 x x'=x-\frac {x^{\frac 1 3}} {\frac 1 3 x^{-\frac 2 3}}=x-3x^{\frac 1 3-(-\frac 2 3)}=x-3x=-2x x=x31x32x31=x3x31(32)=x3x=2x,所以会离零点 x = 0 x=0 x=0 越来越远。(参考上面的图也能发现这个结论)

多项式牛顿迭代

这个在多项式全家桶中用的很多,是用来求一个多项式的零点的。

假设此时要在模 x n x^n xn 意义下求 F ( x ) F(x) F(x) 的零点 G ( x ) G(x) G(x),设 G 0 ( x ) G_0(x) G0(x) F ( x ) F(x) F(x) 在模 x ⌈ n 2 ⌉ x^{\lceil \frac n 2 \rceil} x2n 意义下的零点。

F ( x ) F(x) F(x) G 0 ( x ) G_0(x) G0(x) 处进行泰勒展开,得到
F ( G ( x ) ) ≡ F ( G 0 ( x ) ) + F ′ ( G 0 ( x ) ) 1 ! ( G ( x ) − G 0 ( x ) ) + F ′ ′ ( G 0 ( x ) ) 2 ! ( G ( x ) − G 0 ( x ) ) 2 + . . . F(G(x))\equiv F(G_0(x))+\frac {F'(G_0(x))} {1!}(G(x)-G_0(x))+\frac {F''(G_0(x))} {2!}(G(x)-G_0(x))^2+... F(G(x))F(G0(x))+1!F(G0(x))(G(x)G0(x))+2!F(G0(x))(G(x)G0(x))2+...

由于 F ( G ( x ) ) ≡ 0 ( m o d x n ) F(G(x))\equiv 0 \pmod {x^n} F(G(x))0(modxn),所以 F ( G ( x ) ) ≡ 0 ( m o d x ⌈ n 2 ⌉ ) F(G(x))\equiv 0\pmod {x^{\lceil \frac n 2 \rceil}} F(G(x))0(modx2n),而 F ( G 0 ( x ) ) ≡ 0 ( m o d x ⌈ n 2 ⌉ ) F(G_0(x))\equiv 0 \pmod {x^{\lceil \frac n 2 \rceil}} F(G0(x))0(modx2n),所以 G ( x ) G(x) G(x) 的前 ⌈ n 2 ⌉ \lceil \frac n 2 \rceil 2n 项其实和 G 0 ( x ) G_0(x) G0(x) 一样。

这样的话, G ( x ) − G 0 ( x ) G(x)-G_0(x) G(x)G0(x) 的最低次项就是 x ⌈ n 2 ⌉ x^{\lceil \frac n 2 \rceil} x2n,则 ( G ( x ) − G 0 ( x ) ) 2 (G(x)-G_0(x))^2 (G(x)G0(x))2 的最低次项就是 x 2 ⌈ n 2 ⌉ x^{2\lceil \frac n 2 \rceil} x22n

而上面的柿子是在模 x n x^n xn 意义下进行的,也就是说, ( G ( x ) − G 0 ( x ) ) 2 (G(x)-G_0(x))^2 (G(x)G0(x))2 会被模掉,次数更高的也是,这样的话就得到了:
F ( G ( x ) ) ≡ F ( G 0 ( x ) ) + F ′ ( G 0 ( x ) ) ( G ( x ) − G 0 ( x ) ) F(G(x))\equiv F(G_0(x))+F'(G_0(x))(G(x)-G_0(x)) F(G(x))F(G0(x))+F(G0(x))(G(x)G0(x))

由于 F ( G ( x ) ) ≡ 0 F(G(x))\equiv 0 F(G(x))0,所以有:
F ( G 0 ( x ) ) + F ′ ( G 0 ( x ) ) ( G ( x ) − G 0 ( x ) ) ≡ 0 F ′ ( G 0 ( x ) ) ( G ( x ) − G 0 ( x ) ) ≡ − F ( G 0 ( x ) ) G ( x ) ≡ G 0 ( x ) − F ( G 0 ( x ) ) F ′ ( G 0 ( x ) ) \begin{aligned} F(G_0(x))+F'(G_0(x))(G(x)-G_0(x))&\equiv 0\\ F'(G_0(x))(G(x)-G_0(x))&\equiv -F(G_0(x))\\ G(x)&\equiv G_0(x)-\frac {F(G_0(x))} {F'(G_0(x))}\\ \end{aligned} F(G0(x))+F(G0(x))(G(x)G0(x))F(G0(x))(G(x)G0(x))G(x)0F(G0(x))G0(x)F(G0(x))F(G0(x))

发现和上面牛顿迭代的柿子是差不多的qwq。

有了这个柿子就可以倍增求零点了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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中实现更精确的数值计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值