Day1:
骑行川藏(cycling)
题目大意:
总共有n段路程,且已知每段路程的长度s,风阻系数k,风速vi'。
如果在某一时刻的速度是vi,那么所受的风阻大小 F = ki * (vi - vi') ^ 2,如果某段路程 i 的速度都是vi,那么,消耗的能量W = F * sii
已知所消耗的能量之和不能超过Eu,求最短时间T = sigma( si / vi)
题解:
0、需要知道拉格朗日乘数法和牛顿迭代
1、在一段路程中,速度不变可以求得最优解(证明不会)
2、设n元函数:f(v1, v2, ..., vn) = sigma(si / vi) 和 phi(v1, v2, ..., vn) = sigma(ki * si * (vi - vi') ^ 2)
所需求的就是求出v1, ..., vn使得在phi(v1, ..., vn) < Eu的情况下,f(v1, ..., vn)取得最小值
可以使用拉格朗日乘数法:
设拉格朗日函数:L(v1, ..., vn) = f(v1, ..., vn) + lamda * phi(v1, ..., vn)
求L关于v1, ..., vn的偏导,得到n个式子如下:
-si / (vi^2) + lamda * 2 * ki * si * (vi - vi') = 0
其中i = 1 to n
根据上式,可以得出lamda = 1 / (2 * ki * (vi ^ 2) * (vi - vi')),可以知道,如果lamda增大,vi会变小,phi(v1, ..., vn)会随之变小,是单调的(其中,可以简单地设vi - vi' > 0,以为可以调整vi使满足)
3、于是,可以二分lamda的值,并根据lamda求出vi, ..., vn。
一旦找到phi(v1, ..., vn) = Eu,那么代入f(v1, ..., vn)就可求得最小值
4、二分判断的过程中,需要求出函数lamda = 1 / (2 * ki * (vi ^ 2) * (vi - vi'))中vi的值。
设g(vi) = 2 * lamda * ki * (vi ^ 3) - 2 * lamda * ki * (vi ^ 2) * vi' - 1
g'(vi) = 6 * lamda * ki * (vi ^ 2) - 4 * lamda * ki * vi * vi'
令g'(vi) = 0,求出vi = 0 或 2 / 3 * vi'
于是,可以使用牛顿迭代求g(vi)与x轴最右边的交点
程序: