乙個完全不會計算幾何的蒟蒻的自我拯救……
有的時候會有一些毒瘤計算幾何題,要求的圖形面積邊緣是一段函式,而這個函式解析式通常非常繁瑣,沒辦法直接用公式積分,所以就需要用辛普森積分求近似值。
辛普森積分的用途就是在精度要求不高的時候(通常是求圖形面積)求函式積分的近似值,大概步驟就是在積分區間$[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 那麼這個玩意...
辛普森積分(自適應辛普森公式求積分)
自適應辛普森公式求積分 第一回接觸辛普森積分,至於這個辛普森是幹嘛的呢,在這裡就有必要好好地講一講了。應用 立體幾何中用來求擬柱體體積的公式。這裡就不詳細說辛普森公式了,有需要的朋友可以看這裡 接下來我們好好的說說自適應辛普森公式求積分,自適應辛普森公式求積分是很重要的乙個知識點,弄懂了自適應辛普森...