自適應辛普森積分

2022-05-03 16:00:24 字數 4093 閱讀 8925

乙個完全不會計算幾何的蒟蒻的自我拯救……

有的時候會有一些毒瘤計算幾何題,要求的圖形面積邊緣是一段函式,而這個函式解析式通常非常繁瑣,沒辦法直接用公式積分,所以就需要用辛普森積分求近似值。

辛普森積分的用途就是在精度要求不高的時候(通常是求圖形面積)求函式積分的近似值,大概步驟就是在積分區間$[a,b]$中不斷二分,每次找$a,b,\frac$三點用一條拋物線來擬合原函式,當誤差小於eps的時候就返回答案。

下面推導一波:

設$g(x)$是乙個關於$x$的二次函式,且$g(x)=ax^2+bx+c$,對於定積分$\int_^g(x)dx$求積得$\frac+\frac+cx+d$,其中$d$為常數可以忽略;

令$h(x)=\int_^g(x)dx$,則求其中的一段定積分就有$\int_^g(x)dx=h(b)-h(a)$;

設$g(x)$是當前的擬合函式,那麼有:

$$=h(b)-h(a)$$

$$=\frac(b^3-a^3)+\frac(b^2-a^2)+c(b-a)$$

$$=\frac\times\left[2a(a^2+ab+b^2)+3b(a+b)+6c\right]$$

然後大力拆括號配方:

$$=\frac\times\left[(aa^2+ba+c)+(ab^2+bb+c)+a(a^2+2ab+b^2)+2b(a+b)+4c\right]$$

$$=\frac\times\left[g(a)+g(b)+4a\left(\frac\right)^2+4b\left(\frac\right)+4c\right]$$

$$=\frac\times\left[g(a)+g(b)+4g\left(\frac\right)\right]$$

在實際使用的時候,$g(x)$擬合的曲線可以用$f(x)$代替,因此:

具體實現就是不斷二分區間,用辛普森積分公式求出近似值,當精度達到要求後就返回;

寫起來很方便,核心**就十幾行左右……

注意用辛普森的時候要大力調eps,否則可能會在wa和tle之間徘徊……

模板:洛咕p4525 自適應辛普森法1

1 #include2 #include3 #include4 #include5 #include6 #include7

#define inf 2147483647

8#define eps 1e-9

9using

namespace

std;

10 typedef long

long

ll;11

double

a,b,c,d,l,r;

12double f(double

x)15

double simpson(double l,double

r)18

double sint(double l,double r,double

v)23

return sint(l,mid,lv)+sint(mid,r,rv);24}

25double getint(double l,double

r)28

intmain()

乙個精度更高的做法:

1 #include2 #include3 #include4 #include5 #include6 #include7

#define inf 21474836478//

#define eps 1e-7

9using

namespace

std;

10 typedef long

long

ll;11

const

double eps=1e-7;12

double

a,b,c,d,l,r;

13double f(double

x)16

double simpson(double l,double

r)19

double sint(double l,double r,double ep,double

v)24

return sint(l,mid,ep/2,lv)+sint(mid,r,ep/2

,rv);25}

26double getint(double l,double r,double

ep)29

intmain()

若干個圓台投影之後形狀大概是若干個圓加外公切線圍成的圖形,然後最頂上是個圓錐,整個圖形是軸對稱的,大力辛普森積分就好了;

1 #include2 #include3 #include4 #include5 #include6 #include7

#define inf 2147483647

8#define eps 1e-9

9using

namespace

std;

10 typedef long

long

ll;11 typedef double

db;12

struct

cira[1001

];15

int n,tot=0

;16 db al,mi,mx,t,h[1001],s[1001],r[1001

];17

db f(db x)23}

24for(int i=1;i<=tot;i++)28}

29return

ret;30}

31db sim(db l,db r,db fl,db fm,db fr)

34db sint(db l,db r,db fl,db fm,db fr)

39int

main()

46for(int i=0;i)

51 mx=max(mx,s[n]);

52for(int i=0;i)60}

61 printf("

%.2lf

",sint(mi,mx,0,f((mi+mx)/2),0)*2

);62

return0;

63 }

先把被包含的圓去掉,然後大力切圓就好了

1 #include2 #include3 #include4 #include5 #include6 #include7

#define inf 2147483647

8#define eps 1e-9

9using

namespace

std;

10 typedef long

long

ll;11 typedef double

db;12

struct

node

15 node(db _x,db _y)

16 friend bool

operator

<(node a,node b)

19 }p[1001

];20

struct

cir26

node getf(db xx)

30 }c[1001

];31

intn;

32 db mi=inf,mx=-inf;

33db dis(cir a,cir b)

36db f(db x)

43 sort(p+1,p+top+1

);44

for(int i=1;i<=top;i++)else

if(p[i].y>ls)52}

53return

ret;54}

55db sim(db l,db r,db fl,db fm,db fr)

58db sint(db l,db r,db fl,db fm,db fr)

63int

main()

70 sort(c+1,c+n+1

);71

for(int i=1;i<=n;i++)77}

78}79}

80for(int i=1;i<=n;i++)

83 printf("

%.3lf

",sint(mi,mx,0,f((mi+mx)/2),0

));84

return0;

85 }

自適應辛普森積分

寫在前面方便複習 例題 題目大意 給定 a,b l,r a,b,l,r a,b,l,r 求橢圓 x2a 2 y2 b2 1 frac frac 1 a2x2 b2y2 1 在 l,r l,r l,r 的積分 題目分析 題目所求即為 2 l rb1 x2a2 dx 2 int l rb sqrt dx...

自適應辛普森積分

自適應辛普森積分是一種解決定積分求解問題的演算法。給出乙個函式 f x 求 int l rf x x 我們考慮用一條拋物線來近似這個函式,設 g x ax 2 bx c 那麼可得 begin fraca r 3 l 3 fracb r 2 l 2 c r l frac frac end 那麼這個玩意...

辛普森積分(自適應辛普森公式求積分)

自適應辛普森公式求積分 第一回接觸辛普森積分,至於這個辛普森是幹嘛的呢,在這裡就有必要好好地講一講了。應用 立體幾何中用來求擬柱體體積的公式。這裡就不詳細說辛普森公式了,有需要的朋友可以看這裡 接下來我們好好的說說自適應辛普森公式求積分,自適應辛普森公式求積分是很重要的乙個知識點,弄懂了自適應辛普森...