UVA 1356/ ZOJ 2614 Bridge 弧长积分+二分

本文探讨了如何使用积分和二分法来解决抛物线弧长问题,具体包括求解积分sqrt(a^2+x^2)的方法,以及如何利用该方法计算特定条件下的抛物线弧长。通过实例分析,展示了从理论到实践的完整过程,旨在帮助读者理解数学积分的应用和数值方法的求解策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
//对积分sqrt(a^2+x^2)的求解
double fun(double a,double x)
{
    double aa=a*a,xx=x*x;
    return (x*sqrt(aa+xx)+aa*log(fabs(x+sqrt(aa+xx))))/2;
}
//求宽w,高h的抛物线弧长
double parabola(double w,double h)
{
    double a=4.0*h/(w*w);
    double b=1.0/(2*a);
    return (fun(b,w/2)-fun(b,0))*4*a;
}
int main()
{
    int T,tt=0;
    scanf("%d",&T);
    while(T--)
    {
        int d,h,b,l;
        scanf("%d%d%d%d",&d,&h,&b,&l);
        int n=(b+d-1)/d;//间隔数
        double d1=(double)b/n;
        double l1=(double)l/n;
        double x=0,y=h;
        //弧长随h单调递增,所以用二分法求得h
        while(y-x>1e-5)
        {
            double m=(x+y)/2;
            if(parabola(d1,m)<l1)x=m;
            else y=m;
        }
        if(tt!=0)
            printf("\n");
        printf("Case %d:\n%.2lf\n",++tt,h-x);
    }
    return 0;
}
/*
    纯粹的数学积分题,高数不行啊,寒一个。。。。
    
    建立抛物线公式f(x)=a*x^2,其中a=4*h/(w*w);
    有积分中的弧长公式2∫(0,w/2)√(1+(f'(x))^2)dx=2∫(0,w/2)√(1+4*a^2*x^2)^2)dx
=4a∫(0,w/2)√((1/(2*a))^2+x^2)dx
    
    再由积分表公式∫√(a^2+x^2)dx=1/2*x*sqrt(a^2+x^2)+1/2*a*a*log(fabs(x+sqrt(a*a+x*x)))+C求得弧长
    
    最后二分高度,求得答案
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值