學習筆記 三分法(唔,好像不是唉)

2022-04-30 01:36:13 字數 1719 閱讀 1208

我們知道極值處導函式值為\(0\),那麼我們把這個函式的導數求出來,二分答案即可。

剛剛學習了導數,來看一下與這題有關的導數法則。

\[[f(x)\pm g(x)]'=f'(x)\pm g'(x)

\]那我們推導到更多加減法的求導,對於乙個\(n\)次多項式\(f(x)\):

\[f(x)=\sum\limits_^na_ix^i

\]顯然,它的導數是:

\[f'(x)=\sum\limits_^(i+1)a_x^i

\]這個直接模擬就好了。

對於高次項,容易想到對自變數\(x\)快速冪,不過這樣是\(\mathcal o(n\log n)\)的,有沒有更好的方法呢?

有!早在很早以前,中國數學家秦九韶就提出了秦九韶演算法,我們來舉個栗子吧。

有乙個多項式\(g(x)\):

\[g(x)=ax^3+bx^2+cx+d

\]我們這樣化簡一下:

\[g(x)=x(x(xa+b)+c)+d

\]這樣就能\(\mathcal o(n)\)了。

double f(double g,int n)//求n次多項式f(g)的值

在講述秦九韶演算法時,莫名發現一種奇妙演算法:

快速冪為什麼慢呢?

顯然是重複處理了一些冪次,那我們直接暴算冪次即可,這樣也是\(\mathcal o(n)\)的:

double f(double g,double n)

然後這道題就做完了:

#include#include#includeusing namespace std;

#define read(x) scanf("%d",&x)

#define read_d(x) scanf("%lf",&x)

double fuc[20];

double a[20];

int n;

double l,r;

double f(double g,int n)

int main()

printf("%.5lf\n",mid);

return 0;

}

那麼你如果對於多項式函式的求導一般式一臉懵逼,那麼直接按定義做就好了:

我們知道導數的定義為:

\[f'(x)=\lim\limits_\dfrac

\]我們可以把\(\mathit\delta x\)設成很小的數如\(10^\),然後就行了。

大佬是這樣做的,我來搬運**:

#include using namespace std;

const int n = 15;

const double eps = 1e-10;;

int n;

double l, r, a[n];

double f(double x)

double check(double x)

int main()

printf("%.5lf", l);

return 0;

}

關於複雜度:

二分\(100\)次的話就是\(\mathcal o(100n)\)了,或者寫成\(

\mathcal o(n\log eps)\)。

\(ps\):我自己\(yy\)的竟然比秦九韶演算法快\(8\;ms\)!

三分法(洛谷3382 模板 三分法)

如題,給出乙個n次函式,保證在範圍 l,r 內存在一點x,使得 l,x 上單調增,x,r 上單調減。試求出x的值。輸入格式 第一行一次包含乙個正整數n和兩個實數l r,含義如題目描述所示。第二行包含n 1個實數,從高到低依次表示該n次函式各項的係數。輸出格式 輸出為一行,包含乙個實數,即為x的值。四...

三分法小結

二分法作為分治中最常見的方法,適用於單調函式,逼近求解某點的值。但當函式是凸性函式時,二分法就無法適用,這時三分法就可以 大顯身手 如圖,類似二分的定義left和right,mid left right 2,midmid mid right 2 如果mid靠近極值點,則right midmid 否則...

三分法查詢

我們都知道 二分查詢 適用於單調函式中逼近求解某點的值。如果遇到凸性或凹形函式時,可以用三分查詢求那個凸點或凹點。下面的方法應該是三分查詢的乙個變形。如圖所示,已知左右端點l r,要求找到白點的位置。思路 通過不斷縮小 l,r 的範圍,無限逼近白點。做法 先取 l,r 的中點 mid,再取 mid,...