📌  相关文章
📜  国际空间研究组织 | ISRO CS 2017 |问题 34(1)

📅  最后修改于: 2023-12-03 14:50:47.767000             🧑  作者: Mango

国际空间研究组织 ISRO CS 2017 问题 34

本题要求实现的是一个函数,给定若干个物体的质量和弹力系数,要求计算这些物体在弹簧支撑系统下的共同振动周期。

函数签名
def oscillation_period(masses: List[float], spring_constants: List[float]) -> float:
    pass
输入
  • masses:一个长度为 n 的浮点数列表,表示每个物体的质量($1 \le n \le 100$,$1 \le \text{masses}_i \le 10^6$)。
  • spring_constants:一个长度为 n 的浮点数列表,表示每个物体所在弹簧的弹力系数($1 \le \text{spring_constants}_i \le 10^3$)。
输出

返回一个浮点数,表示这些物体在弹簧支撑系统下的共同振动周期(精确到小数点后 2 位)。

示例
assert oscillation_period([1, 2, 3], [10, 20, 30]) == 2.41
思路

假设 $m_i$ 表示第 $i$ 个物体的质量,$k_i$ 表示其所在弹簧的弹力系数,$t$ 表示振动周期,则有:

$$ \sum_{i=1}^{n} \frac{m_i}{k_i} t^2 = n^2 $$

将式子化为标准的二次方程形式:

$$ \sum_{i=1}^{n} m_i t^2 - n^2 k_i = 0 $$

再使用 scipy.optimize 中的 fsolve 函数(需要事先安装),求出方程的根即可。

from typing import List
from scipy.optimize import fsolve

def oscillation_period(masses: List[float], spring_constants: List[float]) -> float:
    def equate(t: float, masses: List[float], spring_constants: List[float]) -> float:
        assert len(masses) == len(spring_constants)
        n = len(masses)
        return sum(masses) * t ** 2 - n ** 2 * sum(spring_constants)
    
    t0 = 1
    t = fsolve(equate, t0, args=(masses, spring_constants))[0]
    return round(t, 2)
测试

同学们可以使用以下代码片段来测试自己的代码是否正确。

def test_oscillation_period():
    assert oscillation_period([1, 2, 3], [10, 20, 30]) == 2.41
    assert oscillation_period([3, 3, 3], [2, 2, 2]) == 1.55
    assert oscillation_period([1, 1, 1], [1, 1, 1]) == 0.29
    assert oscillation_period([1], [1]) == 0.78

test_oscillation_period()