利用弦收斂求函式根

2021-10-24 10:16:30 字數 1944 閱讀 8606

為了簡單起見,我們只用x座標的時候就代表函式上的點。弦收斂,就是在函式曲線上給定任意弦[a,b],弦與x軸交點為(c,0),那麼將a,b分別與c連線起來,這兩條弦與x軸交於(d,0)、(e,0),取d、e為下一條弦的端點。這樣的迭代下,弦會逐漸向函式的根收斂,體現在兩方面,一是弦的寬度會不斷減小,二是弦與x軸的夾角逐漸接近直角,稍後我們在程式中觀察,這樣我們最終就能達到要求的精度,得到近似值。

程式碼參考:

intersection.py

from math import degrees,

pow,atan

from typing import callable

#function為欲求根的函式

defintersection

(function: callable[

[float],

float

], x0:

float

, x1:

float)-

>

float

:#弦的個數

count=

0#第一條弦的兩個端點

x_n:

float

= x0

x_n1:

float

= x1

while

true

:if x_n == x_n1 or function(x_n1)

== function(x_n)

:raise zerodivisionerror(

"float division by zero, could not find root"

)

count+=

1#求該弦與x軸交點

x_n2:

float

= x_n1 -

( function(x_n1)/(

(function(x_n1)

- function(x_n))/

(x_n1 - x_n)))

#驗證一下弦的收斂

print

("第條弦[,]的寬度為,與x軸的夾角為"

.format

(count,

min(x_n,x_n1)

,max

(x_n,x_n1)

,abs

(x_n-x_n1)

,degrees(atan(x_n1/

(x_n1-x_n2)))

))#精度十萬分之一

ifabs

(x_n - x_n1)

<

10**-5

:print

('*'*30

)return x_n

#求下一條弦的端點的x座標

x_n3:

float

= x_n -

( function(x_n)/(

(function(x_n2)

- function(x_n))/

(x_n2 - x_n)))

x_n4:

float

= x_n1 -

( function(x_n1)/(

(function(x_n1)

- function(x_n2))/

(x_n1 - x_n2)))

#下一條弦

x_n,x_n1=x_n3,x_n4

deff

(x:float)-

>

float

:return

pow(x,3)

-1if __name__ ==

"__main__"

:print

(intersection(f,3,

3.5)

)

利用虛函式求面積

定義抽象基類shape,由它派生出3個派生類 circle 圓形 rectangle 長方形 和 三角形 用虛函式分別計算面積。編寫求面積和函式double totalarea const vector 該函式利用基類指標向量,它的每乙個元素指向乙個派生類的圖形物件。編寫測試直譯器,讀入各種圖形資訊...

牛頓迭代法(求函式的根)

在做二分與三分法的題時,聽聞有牛頓迭代法 感覺很高大上 自己居然捧起書看了一些 由於自己水平很渣,研究的並不深入。本篇未完結.個人感覺 1.使用牛頓迭代法,函式可以是任意 2.優點 對其單調性無特殊要求 缺點 若在該函式值處有多個根,往往只能求出乙個根 3.與二分三分法比較 二分要求是單調函式 三分...

求一元二次函式的根

總時間限制 1000ms記憶體限制 65536kb 描述利用公式x1 b sqrt b b 4 a c 2 a x2 b sqrt b b 4 a c 2 a 求一元二次方程ax2 bx c 0的根,其中a不等於0。輸入輸入一行,包含三個浮點數a,b,c 它們之間以乙個空格分開 分別表示方程ax2 ...