正割法是近似的牛顿切线法,把求导用斜率代替,用切线不断逼近函数的单根。 ![](http://image109.360doc.com/DownloadImg/2022/07/1222/248436085_1_20220712101823473_wm.png)
示意图
![](http://image109.360doc.com/DownloadImg/2022/07/1222/248436085_2_20220712101823769_wm.png)
迭代的起点 ![](http://image109.360doc.com/DownloadImg/2022/07/1222/248436085_3_20220712101823941_wm.png)
推广的公式
![](http://image109.360doc.com/DownloadImg/2022/07/1222/248436085_4_20220712101824286_wm.png)
核心code,直接放上去 ![](http://image109.360doc.com/DownloadImg/2022/07/1222/248436085_5_20220712101824473_wm.png)
眼熟不 ![](http://image109.360doc.com/DownloadImg/2022/07/1222/248436085_6_20220712101824863_wm.png)
你可以编写一个简单的函数来测试这个功能 就是这么简单,当然了字数这么少,还成为不了一篇原创文章。再写一个小程序。
![](http://image109.360doc.com/DownloadImg/2022/07/1222/248436085_7_2022071210182550_wm.png)
我们可以使用Matploatlib的绘图功能模拟 ![](http://image109.360doc.com/DownloadImg/2022/07/1222/248436085_8_20220712101826988_wm.png)
引入 ![](http://image109.360doc.com/DownloadImg/2022/07/1222/248436085_9_20220712101827113_wm.png)
写好要计算的函数 def Y(x): global i i = i+1 plt.plot([x, x], [0, (x**3-x-1)]) plt.plot([x, result(x)], [(x**3-x-1), 0]) temp = round(x-result(x), 5) if(temp == 0.0): print('正割法第', i, '次') print('解得:', round(x, 5)) x = result(x) y = (result(x)**3 - result(x) - 1) plt.plot(x, y, ".") plt.plot(x, y, "g-") plt.annotate("(1.32472,1.32472)", xy=(result(x), (result(x)**3 - result(x) - 1)), xytext=(result(x) - 0.5, (result(x)**3 - result(x) - 1) + 2), color='k', fontsize=10) else: Y(result(x))
Y(2.7)
x = 0 plt.title("secant method") x = np.linspace(0, 3) plt.xlim(0, 3) # 固定坐标 plt.ylim(-5, 20) plt.plot(x, x**3-x-1, "b-") plt.grid(True) plt.plot([0, 3], [0, 0], "--") plt.show()
|