noi2012

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轴最右边的交点

程序:

bicycling.cpp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值