自適應辛普森公式求積分
第一回接觸辛普森積分,至於這個辛普森是幹嘛的呢,在這裡就有必要好好地講一講了。
應用:立體幾何中用來求擬柱體體積的公式。
這裡就不詳細說辛普森公式了,有需要的朋友可以看這裡:
接下來我們好好的說說自適應辛普森公式求積分,自適應辛普森公式求積分是很重要的乙個知識點,弄懂了自適應辛普森公式求積分就能明白辛普森積分是幹嘛的了,
下面的內容是重點!!!:
假設我們求以下積分:
比較特殊的情況,就是可以推導出來最後的形式。但是比較一般的情況是,我們只能大致得到乙個xy座標系裡的曲線,我們求的就是曲線和x軸所圍成的面積。
因此我們有自適應辛普森公式,他會根據實際情況來自動的調整精度。
它的大致過程就是,給定乙個要求達到的精度eps,演算法就會根據實際情況遞迴的劃分區間。容易近似的地方少劃分,不容易近似的地方多劃分幾份。
具體來講,我們在以下情況下直接返回結果,否則遞迴劃分區間:
具體參考部落格:
下面舉個例題:hdu-1724
題目大意:題目就是求兩條線所夾的橢圓的面積。這是個標準的橢圓,其中心在原點。我好像看到了題目連橢圓面積公式都給了,然而並沒有任何用,直接上辛普森!
根據橢圓的對稱性,我們求x軸上方的面積然後乘以2就是答案。根據橢圓方程x2a2+y2b2=1,建構函式y=。。。其中y>0,然後對此函式進行自適應辛普森積分就可以了。
寫完程式過了樣例後立馬交,tle,1000ms。結果發現是eps取的太小了,取了1e-10,隨著遞迴下去,eps不斷除以2,導致不斷遞迴劃分,做的次數很多就超時了。這題只要求保留3位小數,所以精度沒有太大問題,將eps改為1e-5立馬就ac了,109ms。
ac**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ri(n) scanf("%d",&n)
#define oi(n) printf("%d\n",n)
#define rl(n) scanf("%lld",&n)
#define ol(n) printf("%lld\n",n)
#define rep(i,l,r) for(i=l;i<=r;i++)
#define rep1(i,l,r) for(i=l;iusing
namespace
std;
typedef
long
long ll;
const
int inf=0x3f3f3f3f;
const
double eps=1e-5;//這裡的eps是整個辛普森應用的關鍵,至於取多大,得依題目而定
double a,b,l,r;
double f(double x)//這裡的f函式是自己根據題目推導出來的,主要還是x有關y的函式
double simpson(double a,double b)//這裡是辛普森公式
double ars(double a,double b,double eps)//這裡就是遞迴求辛普森最重要的一段函式了,
int main()
return
0;}
自適應辛普森公式求積分
假設我們求以下積分 b af x dx 比較特殊的情況,就是可以推導出來最後的形式。但是比較一般的情況是,我們只能大致得到乙個xy 座標系裡的曲線,我們求的就是曲線和 x 軸所圍成的面積。因此我們有自適應辛普森公式,他會根據實際情況來自動的調整精度。它的大致過程就是,給定乙個要求達到的精度eps,演...
自適應辛普森積分
寫在前面方便複習 例題 題目大意 給定 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...
自適應辛普森積分
乙個完全不會計算幾何的蒟蒻的自我拯救 有的時候會有一些毒瘤計算幾何題,要求的圖形面積邊緣是一段函式,而這個函式解析式通常非常繁瑣,沒辦法直接用公式積分,所以就需要用辛普森積分求近似值。辛普森積分的用途就是在精度要求不高的時候 通常是求圖形面積 求函式積分的近似值,大概步驟就是在積分區間 a,b 中不...