题目描述
求函数 y 2 = 2 A x y^2=2Ax y2=2Ax 和 y = B x + C y=Bx+C y=Bx+C 两个曲线所围出的面积。如果没有所围面积,则输出0
输入描述
第一行一个数
n
n
n,表示测试用例的组数
接下来
n
n
n 行,每行输入三个数,分别是 A B C
每个用例输出一个数,表示面积,相对误差在
1
0
−
4
10^{−4}
10−4都算对
输入
1
1 1 -6
输出
31.2481110540
- 先判断曲线是否存在交点,没有交点,输出0.
- 第一个函数是 y y y的二次函数,看起来不方便,把 x x x和 y y y交换,然后联立方程求解,注意第二个方程也要交换 x x x和 y y y,可得 y = x 2 2 A = x − C B y=\frac{x^2}{2A}=\frac{x-C}{B} y=2Ax2=Bx−C,可以得到一个二次函数 B x 2 − 2 A x + 2 A C = 0 Bx^2 -2Ax+2AC=0 Bx2−2Ax+2AC=0,最后化简,根据判别式( b 2 − 4 a c b^2-4ac b2−4ac)是否>0判断是否存在交点,如果有交点,接下来求面积
- 求面积直接手动求解定积分,求出来是个三次函数,带入上下限进行计算
具体步骤
二次函数为 B x 2 − 2 A x + 2 A C = 0 Bx^2 -2Ax+2AC=0 Bx2−2Ax+2AC=0,注意此处相当于把 y y y 扩大了 2 A B 2AB 2AB倍 ( y = x 2 2 A = x − C B y=\frac{x^2}{2A}=\frac{x-C}{B} y=2Ax2=Bx−C),最后求积分的时候要除以放大倍数.
判别式为: b 2 − 4 a c = 4 A 2 − 8 A B C b^2-4ac=\sqrt{4A^2-8ABC} b2−4ac=4A2−8ABC
交点为: x 1 = − b − d e l t a 2 a x_1=\frac{-b-delta}{2a} x1=2a−b−delta, x 2 = − b + d e l t a 2 a x_2=\frac{-b+delta}{2a} x2=2a−b+delta
带入可得 x 1 = 2 A − d e l t a 2 B x_1=\frac{2A-delta}{2B} x1=2B2A−delta, x 2 = 2 A + d e l t a 2 B x_2=\frac{2A+delta}{2B} x2=2B2A+delta
求面积,定积分表达式为 1 3 B x 3 − A x 2 + 2 A C x ∣ x 1 x 2 \frac{1}{3}Bx^3 -Ax^2+2ACx | ^{x_2}_{x_1} 31Bx3−Ax2+2ACx∣x1x2,带入上下限 x 1 x_1 x1和 x 2 x_2 x2,最后记得除以之前的放大倍数 2 A B 2AB 2AB
n = int(input())
for i in range(n):
A, B, C = [int(i) for i in input().split()]
delta = 4 * A ** 2 - 8 * A * B * C
if delta <= 0:
print(0)
else:
x1 = 0.5 * (2 * A / B) - delta ** 0.5 / B
x2 = 0.5 * (2 * A / B) + delta ** 0.5 / B
ans = abs((x1 ** 3 * B / 3 - A * x1 ** 2 + 2 * A * C * x1
- (x2 ** 3 * B / 3 - A * x2 ** 2 + 2 * A * C * x2))
/ (2 * A * B))
print(ans)