為了簡單起見,我們只用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 ...