牛顿法原理(matlab实现,求零点,求极值) | 您所在的位置:网站首页 › matlab求解函数条件极值 › 牛顿法原理(matlab实现,求零点,求极值) |
开头
重点 本文对于牛顿法求零点和求极值点进行简单的公式推导,并使用matlab实现算法,同时做两道简单习题。 又是艰难的一天呢。 今天用matlab写牛顿法,竟然又搞了好几个小时,我真的是有点绝望。唉,我太难了,好在最后解决了我脑袋中的bug.我竟然是个学数学的垃圾。。。 好像有点无厘头。。。 改一下子,好像应该写个摘要。 正文 原理对于给定的函数 f ( x ) f(x) f(x),我们将其在 x 0 x_0 x0泰勒展开(严谨的人应该注意 f ( x ) f(x) f(x)需满足泰勒展开的条件),有如下结果: f ( x ) = f ( x 0 ) + f ′ ( x 0 ) 1 ! ( x − x 0 ) + . . . + f ( n ) ( x 0 ) n ! ( x − x 0 ) n + o ( x n ) f(x)=f(x_0)+\frac{f'(x_0)}{1!}(x-x_0)+...+\frac{f^{(n)}(x_0)}{n!}(x-x_0)^n+o(x^n) f(x)=f(x0)+1!f′(x0)(x−x0)+...+n!f(n)(x0)(x−x0)n+o(xn) 令 f ( x ) = 0 f(x)=0 f(x)=0,则有: f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) = 0 f(x_0)+f'(x_0)(x-x_0)=0 f(x0)+f′(x0)(x−x0)=0 x = x 0 − f ( x 0 ) f ′ ( x 0 ) x=x_0-\frac{f(x_0)}{f'(x_0)} x=x0−f′(x0)f(x0) 故在求函数零点时,有如下迭代公式: x i + 1 = x i − f ( x i ) f ′ ( x i ) x_{i+1}=x_i-\frac{f(x_i)}{f'(x_i)} xi+1=xi−f′(xi)f(xi) 当我们要求函数的极值点时,我们令 f ′ ( x ) = 0 f'(x)=0 f′(x)=0,对于泰勒展开式有如下结果: 0 = f ′ ( x 0 ) + f ′ ′ ( x 0 ) ( x − x 0 ) 0=f'(x_0)+f''(x_0)(x-x_0) 0=f′(x0)+f′′(x0)(x−x0) x = x 0 − f ′ ( x 0 ) f ′ ′ ( x 0 ) x=x_0-\frac{f'(x_0)}{f''(x_0)} x=x0−f′′(x0)f′(x0) 故求函数的极值点时,我们有下面的迭代公式: x i + 1 = x i − f ′ ( x i ) f ′ ′ ( x i ) x_{i+1}=x_i-\frac{f'(x_i)}{f''(x_i)} xi+1=xi−f′′(xi)f′(xi) 原理说完了,现在我们就开始进行最为有趣的实践环节喽。不能总是纸上谈兵嘛,数学总要用起来才能真正体现出他的价值。 应用题目1.求出函数 y = ( x − 3 ) 3 y=(x-3)^3 y=(x−3)3与 x x x轴的交点,并在图像上标注出来。 题目貌似有点简单,但是我们最重要的是对方法的掌握。 代码如下: 首先是牛顿法求零点(与 x x x轴交点)的函数。 function res=findzeroNt(f,var,x0,e,max) df=diff(f); for i=1:max x1=x0-subs(f,var,x0)/subs(df,var,x0); if abs(x1-x0)sigma if subs(diff(f),var,x0)==0 break end if n>20 break end x1=x0-subs(diff(f),var,x0)/subs(diff(f,2),var,x0); x1=double(x1); wucha=abs(x1-x0); x0=x1; n=n+1; end min=x0;然后是主函数代码: clc,clear syms x f=exp(-x)+x^2;%函数表达式 ezplot(f) hold on res=Newton(0,f,0.001,x) plot(res,subs(f,x,res),'r*')图像如下: 牛顿迭代法虽然可以解决一些问题,但是对于有些函数效果不太理想,还有待进一步改进。待我好好研究。。。 |
CopyRight 2018-2019 实验室设备网 版权所有 |