📅  最后修改于: 2023-12-03 14:50:47.767000             🧑  作者: Mango
本题要求实现的是一个函数,给定若干个物体的质量和弹力系数,要求计算这些物体在弹簧支撑系统下的共同振动周期。
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()