【51 Nodアルゴリズムマラソン18 C】数値計算

2286 ワード

Description
F(x)=Σwk=1(Ak+sin(k)∗sin(x+k)+Bk+cos(k)∗cos(x+k))にF(x)=0の前nの小さい正根の和を求める.n<=3 e 6,A<=1 e 3,B<=1 e 3のうちwは定値であり,1 e 4は小数点以下3桁まで保持する
Solution
この方程式の根を求める問題には,きっと循環周期があるに違いない.この正弦波と余弦の関数は明らかにπ=3.141592653589793238である......の各見出しページがあります.そして私は関数が0~πで単調であると仮定し、次いでゼロ点(精度を大きくする)を2点に分けて1番目のゼロ点l=3.1133909143552221を2点に分けた......、そしてどんどんπを加えればいいのです.三角関数の数学の基礎が足りないので、なぜ単調なのかは証明されません.
Code
#include
#include
#include
#include
#include
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
int A,B,n,i;
double k,l,t,r,mid,ans,gen;
double doing(double x){
    int i;double y=0;
    fo(i,1,10000){
        y+=A*sin(x+i)/(i+sin(i))+B*cos(x+i)/(i+cos(i));
    }
    return y;
}
int main(){
    scanf("%d%d%d",&A,&B,&n);
  /*  l=0,r=3.14159265358979323846264;
    while(r-l>0.0000000001){
        mid=(l+r)/2;
        if(doing(mid)<0)l=mid;else r=mid;
    }*/
    l=3.1133390914355221;
    fo(i,1,n){
        ans+=l;
        l+=3.14159265358979323846264;
    }
    printf("%.3f
"
,ans); }