2013年2月4日 星期一

SGU 217 Two Cylinders 5/10


先做出積分式


接下來對其做數值模擬

因為精度的關係,這邊要使用一個稱為

『辛普森公式』的數值模擬方法

選三個點,用二次函數去fit他

接著就去算這曲線的面積,最後把這些東東全部加起來

寫的漂亮一點,可以弄成公式:

dx/3*(y0+4y1+2y2+…+2yn-2+4yn-1+yn)

//By momo
#include
#include
#include
#include
#define N 1000000
using namespace std;

double r1, r2, ans = 0;
double f(double x){
    return 8*sqrt((r1*r1-x*x)*(r2*r2-x*x));
}

int main (){
    scanf("%lf%lf", &r1, &r2);
    if(r1 > r2) swap(r1, r2);
    double dx = r1/N;
    for(int i = 0; i <= N; i++){
        double coe;
        if(i == 0 || i == N) coe = 1;
        else coe = (i&1)?4:2;
        ans += coe*dx*f(dx*i)/3;
    }
    printf("%.4lf\n", ans);
}

沒有留言:

張貼留言