当前位置 博文首页 > 文章内容

    自适应辛普森积分

    作者: 栏目:未分类 时间:2020-07-14 16:03:10

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    感觉就是骗分工具,就像模拟退火一样

    神仙的博客

    P4526自适应辛普森法2

    #include<bits/stdc++.h>
    typedef double db;
    using namespace std;
    const db eps=1e-7;
    db a;
    db f(db x)
    {
    	return pow(x,a/x-x);
    }
    db simpson(db l,db r)
    {
    	return (f(l)+f(r)+4*(f((l+r)/2)))*(r-l)/6;
    }
    db integral(db l,db r,db eps,db a)
    {
    	db mid=(l+r)/2;
    	db L=simpson(l,mid),R=simpson(mid,r);
    	if(abs(L+R-a)<=eps*15) return L+R+(L+R-a)/15;
    	return integral(l,mid,eps/2,L)+integral(mid,r,eps/2,R);
    }
    int main()
    {
    	scanf("%lf",&a);
    	if(a<0) printf("orz\n");
    	else printf("%.5lf\n",integral(eps,20,eps,simpson(eps,20)));
    	return 0;
    } 
    

    也可以用来求圆的面积并(尽管不是正解)

    #include<bits/stdc++.h>
    typedef double db;
    using namespace std;
    const int N=1100;
    const db blo=10;
    struct seg
    {
    	db l,r;
    	seg(db x=0,db y=0):l(x),r(y){}
    };
    int fa[N];
    db mx[N],mn[N];
    int n;
    db x[N],y[N],r[N];
    map<double,double> hav;
    int find(int x)
    {
    	if(fa[x]==x) return x;
    	return fa[x]=find(fa[x]);
    }
    void merge(int a,int b)
    {
    	a=find(a),b=find(b);
    	fa[a]=b;
    	mx[b]=max(mx[b],mx[a]);
    	mn[b]=min(mn[b],mn[a]);
    	return;
    }
    int cmp(seg a,seg b)
    {
    	return a.l<b.l;
    }
    db f(db X)
    {
    	vector<seg> a;
    	for(int i=1;i<=n;i++)
    	{
    		db d=abs(x[i]-X);
    		if(r[i]<d) continue;
    		d=sqrt(r[i]*r[i]-d*d);
    		a.push_back(seg(y[i]-d,y[i]+d));
    	}
    	sort(a.begin(),a.end(),cmp);
    	int siz=a.size();
    	if(siz==0) return 0;
    	db sum=0,l=a[0].l,r=a[0].r;
    	for(int i=1;i<siz;i++)
    	{
    		if(a[i].l<=r) r=max(a[i].r,r);
    		else
    		{
    			sum+=r-l;
    			l=a[i].l;
    			r=a[i].r;
    		}
    	}
    	sum+=r-l;
    	return sum;
    }
    db simpson(db l,db r)
    {
    	return (f(l)+f(r)+4*f((l+r)/2))*(r-l)/6;
    }
    db integral(db l,db r,db eps,db a)
    {
    	db mid=(l+r)/2;
    	db L=simpson(l,mid),R=simpson(mid,r);
    	if(abs(L+R-a)<=eps*15) return L+R+(L+R-a)/15;
    	return integral(l,mid,eps/1.5,L)+integral(mid,r,eps/1.5,R);
    }
    int main()
    {
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++) scanf("%lf%lf%lf",&x[i],&y[i],&r[i]);
    	for(int i=1;i<=n;i++) fa[i]=i,mn[i]=x[i]-r[i],mx[i]=x[i]+r[i];
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=i+1;j<=n;j++)
    		{
    			if(abs(x[i]-x[j])<=r[i]+r[j])
    			{
    				merge(i,j);
    			}
    		}
    	}
    	db ans=0;
    	double cnt=0;
    	for(int i=1;i<=n;i++) if(fa[i]==i) cnt+=1;
    	for(int i=1;i<=n;i++) if(fa[i]==i) ans+=integral(mn[i],mx[i],1e-3/cnt,simpson(mn[i],mx[i]));
    	printf("%.3lf\n",ans);
    	return 0;
    }