【用积分求抛物线与直线围成的面积】


一、Problem Discription

The Area

二、Sample Input and Sample Output

Sample Input and Sample Output


三、数学分析与推导计算

1. 根据抛物线顶点坐标 P 1 ( x 1 , y 1 ) P_1(x_1, y_1) P1(x1,y1)以及另一个点的坐标 P 2 ( x 2 , y 2 ) P_2(x_2, y_2) P2(x2,y2),求出抛物线方程

顶点坐标为(b, c)的顶点式抛物线方程式如下
y = a ( x − b ) 2 + c y=a(x-b)^2+c y=a(xb)2+c
此处顶点坐标为 P 1 ( x 1 , y 1 ) P_1(x_1, y_1) P1(x1,y1),可得 b = x 1 b=x_1 b=x1, c = y 1 c=y_1 c=y1.
因此
y = a ( x − x 1 ) 2 + y 1 y=a(x-x_1)^2+y_1 y=a(xx1)2+y1
再代入 P 2 ( x 2 , y 2 ) P_2(x_2, y_2) P2(x2,y2),得到
a = ( y 2 − y 1 ) ( x 2 − x 1 ) 2 a=\frac {(y_2 - y_1)} {(x_2 - x_1)^2} a=(x2x1)2(y2y1)

2. 根据直线上两点坐标 P 2 ( x 2 , y 2 ) P_2(x_2, y_2) P2(x2,y2) P 3 ( x 3 , y 3 ) P_3(x_3, y_3) P3(x3,y3),求出直线方程(直线的斜率和截距方程)

k = y 3 − y 2 x 3 − x 2 k=\frac{y_3 - y_2}{x_3 - x_2} k=x3x2y3y2
因此
y = k x + d y=kx+d y=kx+d
再代入 P 2 ( x 2 , y 2 ) P_2(x_2, y_2) P2(x2,y2),得到
d = y 2 − k x 2 d=y_2 - kx_2 d=y2kx2

3. 根据求出的直线方程和抛物线方程,以及直线和抛物线交点坐标,用积分求阴影部分的面积

( a ( x − b ) 2 + c − ( k x + d ) ) d x ( a(x-b)^2+c - (kx+d))dx (a(xb)2+c(kx+d))dx为被积表达式,在闭区间 [ x 2 , x 3 ] [x_2,x_3] [x2,x3]上作定积分,便可得所求阴影部分的面积。
A = ∫ x 2 x 3 ( a ( x − b ) 2 + c − ( k x + d ) ) d x A=\int_{x_2}^{x_3} ( a(x-b)^2+c - (kx+d))dx A=x2x3(a(xb)2+c(kx+d))dx
A = [ 1 3 a x 3 − 1 2 ( 2 a b + k ) x 2 + ( a b 2 + c − d ) x ] x 2 x 3 A=\Big[\frac {1} {3} ax^3 - \frac {1} {2} (2ab+k)x^2 + (ab^2+c-d)x\Big]_{x_2} ^{x_3} A=[31ax321(2ab+k)x2+(ab2+cd)x]x2x3

四、编码计算求解

代码如下(参考)

#include <iostream>
#include <iomanip>
using namespace std;

double a, b, c, k, d;
// y=a(x-b)^2+c
// y=kx+d
double integral(double x) {
    return a*x*x*x/3.0 - (2*a*b+k)*x*x/2.0 + (a*b*b+c-d)*x;
}
int main() {
	double x1, y1, x2, y2, x3, y3;
    int t;
    cin >> t;
    for(int i=0; i<t; i++){
        cin >> x1 >> y1;
        cin >> x2 >> y2;
        cin >> x3 >> y3;
        b = x1;
        c = y1;
        a = (y2-y1)/((x2-x1)*(x2-x1));
        k = (y3-y2)/(x3-x2);
        d = y2-k*x2;
        double ans = integral(x3) - integral(x2);
        //printf("%.2lf\n", ans);
        cout << fixed << setprecision(2) << ans << endl;
    }
    return 0;
}

测试如下

2
5.00 5.00
0.00 0.00
10.00 0.00
33.33
10.00 10.00
1.00 1.00
14.00 8.222222
40.69
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值