热门文章
最新发布
-
关于纸牌游戏的一些思考 0 前言 对纸牌一直以来都有一些特殊的感情,像是纸牌魔术、飞牌特技、纸牌游戏等,都很喜欢。鉴于我家每年过年都有打牌的活动,放着春晚,打着扑克,所以我的打牌能力也还不错。晚上的时候,和几个朋友打了会儿惯蛋,再次激起了我对这个游戏的思考,因此简单记一下。 1 规则介绍 1.1 “跑得快” 这是我们那一种纸牌游戏的叫法,也是我家过年经常玩的纸牌游戏,名称跟其他地方可能有差异。规则通常如下: 游戏人数:3~4人 纸牌数目:一副扑克牌,去除大王、小王、梅花2、黑桃2、方块2和梅花A,还剩下48张牌 单牌大小:2 > A > K > Q > J > 10 > 9 > 8 > 7 > 6 > 5 > 4 > 3 对子大小:对A > 对K > ... > 对3 三连大小:三个K > ... > 三个3 炸弹大小:三个A > 四个K > ... > 四个3 摸牌阶段:洗好牌后,然后将牌分成两堆,从处于下面的那堆开始摸牌 出牌阶段: 如果其他人出的牌,自己有更大的牌能管住,则必须出牌管住,如果能管住却跳过不要,被发现直接判负 如果该出单张且下家手牌为一张,在能管住的条件下,必须从最大的牌开始出起 如果自己出的牌,其他人都要不起,则可以随意出牌 自己随意出牌时,若下家手牌只有一张,则必须先出单张以外的牌,如:对子、三连等;如果手里只有单张,则必须从最大的牌开始出起 出牌阶段结束时,如果手牌小于等于2张,则需要出声提示 输赢判断:第一个出完牌的人为赢家;赢家确定后,剩余手牌数最多的为输家;剩余手牌数最多的为多个人时,则都为输家;若剩余手牌数最多的人只有1张牌,则没有输家 失败惩罚:下一局游戏摸牌结束后,输家需要将最大的手牌上贡给赢家;还可以额外增加其他的惩罚内容 出牌规则: 单顺:三人时至少6张,四人时至少5张,且“2”不能参与单顺 双顺:至少2连,如:“33-44”、“33-44-55” 三连:可以带0~2张牌,带的牌可以任意组合,如:“333”、“333-4”、“333-44”、“333-4-5” 炸弹:可以带0或3张牌,带的牌可以任意组合。带2张牌时可以被更大的炸弹带3张牌管住,或者被任意不带牌的炸弹管住。如:“6666-555” < “7777-333”、“6666-555” < “3333” 先手规则:洗牌结束后,赢家的上家负责把牌堆分成两份,赢家第一个摸牌;先手出牌的规则通常从以下方式中选择一个 开局红桃3先出,此后上一把的赢家先出 洗牌结束后将第一张牌亮开,然后分成两堆摸牌,每局抓到亮开牌的人先出 1.2 惯蛋 这是一个比较常规的玩法,网上有很多这种玩法的小游戏和说明,这里就不再介绍。 2 游戏思考 2.1 “跑得快” 这个游戏主要在于出牌时管得住时必须管住,是一个非常“刚猛”的规则,这也是它和其他常见的纸牌游戏最大的区别,你不能故意放对手走而等待“出其不意”。这条规则虽然对自己的牌序有了很大的限制,但学会巧妙利用,也能让局面有利于自己。比如:你手里有一张A,场上的2还没有出,该你出牌时,你可以顶一张Q或者K,逼迫其他人出A或者2,从而将自己的A做大拿下下一轮单牌的牌权;或者你开局出33-44之类的小连对,在对手还没有把连对拆开之前,逼迫他们出更大的连对管住你,我玩的时候,基本每次都会遇到开局33-44顶下来下家的KK-AA。所以善用这条规则,使用合理的出牌方式,逼迫出其他人的大牌且保留自己的反击手段,是制胜的关键。 因为这条规则的存在,使得这个游戏更容易被数学解释,这就意味着它相对其他纸牌游戏更加简单、更容易算计。但常常也会觉得“身不由己”,明明自己有一条单顺可以解决很多单张,却因为上家的一个对子不得不将单顺中的对子打出去,破坏了牌型。这就很有一种,你明知道别人在下套坑你,但你却又不得不主动进套,尽感心酸与无奈。 这个游戏在心理上的博弈非常有限,更加考验你的记牌能力和计算能力。相对而言,这个游戏更容易建立可靠的数学模型。其实,我个人很喜欢这种“直来直往”的游戏方式,要得起就要,要不起就不要。就如同喜欢就是喜欢,不喜欢就是不喜欢,不需要额外的伪装和纠结。只是现实不可能像游戏那么简单,特别是这种规则更加“简单粗暴”的游戏。 2.2 惯蛋 这个游戏需要一定的团队合作能力,需要和对家相互配合以及一定的心理博弈。今天跟朋友玩的时候,因为大家都很熟,所以他们的打牌风格我很熟悉。涉及心理博弈的游戏,最好的局面就是对手的战术和想法你都能猜到,这样你就很容易做出针对性的应对。此外,跟我一队的朋友,我们俩的打牌风格很类似,所以配合起来也更默契。今天打的三局,从积分来看,两局大胜,一局小负。 对我来说,惯蛋最有意思的地方就在于凑同花顺和顺子。在牌不是特别的整齐时,我很喜欢拆炸弹凑同花。相对而言,我不那么喜欢出三连顺,因为三连顺往往能够凑出来两个单顺。然而凑同花顺和顺子的计算力比按部就班的出法大得多,特别是有万能牌的情况下。今天有一局就因为手里对子太多了且有一张万能牌,能凑出来多个顺子而让我思考了很久。 不知道对手性格时,只能按照自己的牌型进行出牌判断;了解对手性格时,还需要思考对手这么出是否有额外的目的,是否应该不惜代价进行阻击,他是在诈唬骗火力还是在准备偷跑;此外,队友的性格也很重要,如果和队友风格差异很大,就很难相互配合了。了解对手的行为比分析自己的牌型更为重要。这也更加符合了现实中的事情,在做判断时,除了考虑自身条件外,还需要考虑竞争对手的心理活动。相对“跑得快”,惯蛋的博弈难度更高,需要根据局面、对手的心理、队友的心理进行综合判断。 3 总结 不管什么游戏吧,是否有博弈,既然是游戏,一起玩的人才最重要,只顾自己的输赢,也未必就会玩的开心。游戏不止输赢,生活也不止输赢,遵循本心,开心快乐最重要。
-
在Docker中安装宝塔面板 0 前言 由于我的电脑是M1芯片Mac,无法直接安装宝塔面板,于是尝试在Docker容器中安装宝塔面板,以便搭建本地博客用于测试。 1 安装教程 1.1 安装Docker 官网:https://www.docker.com/ 安装:前往官网下载对应系统的安装包进行安装 1.2 配置ubuntu环境 打开终端,下载需要的版本,此处以22.04为例(:后为版本号,不指定版本默认下载最新版) docker pull ubuntu:22.04 创建镜像,并进行端口映射 docker run -i -t --name ubuntu22 -p 2020:20 -p 2121:21 -p 8080:80 -p 4430:443 -p 8880:888 -p 8888:8888 ubuntu:22.04--name: 镜像名称,自定义,此处为ubuntu22 -p: 端口映射,本机端口:镜像端口。至少需要映射80和8888两个端口,前者用于站点访问,后者用于宝塔面板web端访问。 镜像创建完成后,终端自动进入镜像中,以下操作均需要在镜像中进行。 更新apt-get apt-get update 安装sudo apt-get -y install sudo 安装wget apt-get -y install wget1.3 安装宝塔面板 官网:https://www.bt.cn/new/download.html 使用安装脚本进行安装(不同的系统命令不同,以下为Ubuntu/Deepin安装脚本) wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed8484bec 有提示的选择Y即可,等待安装完成 通常情况下,宝塔面板会随机分配一个端口用于WEB面板,随机的端口大概率没有进行端口映射,因此需要将其修改为8888。在容器终端中输入bt 8,输入新的端口号8888即可 bt 8 在本机浏览器中输入localhost:8888(宝塔面板安装成功时提示的内网面板地址,有时候端口号后面还有一些字符)进入WEB面板登录界面,输入账号密码进行登录 进入WEB面板后,选择LNMP极速安装 2 遇到的问题 如果出现MySQL提示安装已完成,但在数据库界面又显示未安装MySQL,可能是内存不足导致的。 解决方案:在WEB面板的软件商店中安装Linux工具箱,安装完成后,点击【设置】-【Swap/虚拟内存】,分配2G左右的Swap,然后重新安装MySQL即可 参考 Docker中安装宝塔的详细教程 docker配置ubuntu环境
-
2023年环法自行车赛公告 路线 总计:3405.6公里 阶段地形日期起点和终点距离1丘陵周六 07/01/2023毕尔巴鄂 > 毕尔巴鄂182 KM2丘陵周日 07/02/2023维多利亚-加斯特伊兹 > 圣塞巴斯蒂安209 KM3平坦周一 07/03/2023阿莫雷比埃塔-埃特克萨诺 > 巴约讷193.5 KM4平坦周二 07/04/2023达克斯 > 诺加罗182 KM5山地周三 07/05/2023波城 > 拉伦斯163 KM6山地周四 07/06/2023塔布 > 科特雷-坎巴斯克145 KM7平坦周五 07/07/2023蒙德马桑 > 波尔多170 KM8丘陵周六 07/08/2023利布尔纳 > 利摩日201 KM9山地周日 07/09/2023圣莱奥纳尔德诺布拉 > 多姆山182.5 KM-休息日周一 07/10/2023克莱蒙费朗-10丘陵周二 07/11/2023武尔卡尼亚 > 伊苏瓦尔167.5 KM11平坦周三 07/12/2023克莱蒙费朗 > 穆兰180 KM12丘陵周四 07/13/2023罗阿讷 > 博若莱地区贝尔维尔169 KM13山地周五 07/14/2023沙拉龙河畔沙蒂永 > 大科隆比尔138 KM14山地周六 07/15/2023安纳马斯 > 莫尔济讷152 KM15山地周日 07/16/2023太阳门 > 圣热尔韦勃朗峰179 KM-休息日周一 07/17/2023圣热尔韦勃朗峰-16个人计时赛周二 07/18/2023帕西 > 孔布卢22.4 KM17山地周三 07/19/2023圣热尔韦勃朗峰 > 高雪维尔166 KM18丘陵周四 07/20/2023穆捷 > 布雷斯地区布尔格185 KM19平坦周五 07/21/2023蒙塔涅地区穆瓦朗 > 波利尼173 KM20山地周六 07/22/2023贝尔福 > 勒马克斯坦费勒灵133.5 KM21平坦周日 07/23/2023伊夫林省圣康坦 > 巴黎香榭丽舍大街115.5 KM阶段 共分为21个阶段: 8个平坦赛段 4个丘陵赛段 8个山地赛段 4次山顶终点 1次个人计时赛 2个休息日 奖金 车队和车手将获得总计230万欧元的奖金,其中个人总成绩最终获胜者将获得50万欧元的奖金。 参考 https://www.letour.fr/en/overall-route
-
信达HEQ5赤道仪固件升级步骤 0 准备阶段 HEQ5赤道仪 SynScan V4手控器及连接线 EQMOD数据线:用来升级赤道仪电机固件,该数据线一端接入赤道仪手控器端口,一端接入电脑USB端口 Windows电脑 1 手控器固件升级 1.1 程序及文档下载 下载SynScan固件加载程序,当前最新版本3.5 官网:https://inter-static.skywatcher.com/downloads/synscanfirmwareloader_ver35.zip 下载SynScan V4/V5手控器固件,当前最新版本4.39.21 官网:https://inter-static.skywatcher.com/downloads/synscan_ver043921_firmware_release.zip 下载SynScan手控器固件更新使用说明书 官方英文:https://inter-static.skywatcher.com/downloads/instructiononfirmwareupdate_synscanhandcontroller.pdf 中文翻译:https://www.washy.cn/usr/uploads/2023/06/2094330537.pdf 以上内容均来自SkyWatcher官网 -> SUPPORT -> SOFTWARE&FIRMWARE -> SynScan V4/V5 Hand Controller,可自行前往查看。1.2 更新固件 同时按住手控器的“0”和“8”键,然后插入电源线(最右侧端口) 手控器发出“哔”的一声,表示启动成功。同时手控器屏幕将显示"SynScan Update Ver x.x"。 在PC上打开固件加载程序,勾选【Auto-detect COM Port】,点击【HC.Version】自动连接到手控器的COM端口 固件加载程序成功连接手控器后,将在固件加载器的底部看到版本号 点击【Browse】选择下载的最新版本固件(ssf文件),勾选【Enforce database update】,点击【Update】进行更新。更新完成后,固件加载程序底部将显示一个绿色的“Update Complete”条,如下 2 电机固件升级 2.1 程序及文档下载 下载电机控制器固件加载程序(非Wi-Fi版),当前最新版本1.78 官网:https://inter-static.skywatcher.com/downloads/mcfirmwareloader_178.zip 下载HEQ5 Go-To电机固件,当前最新版本3.39 官网:https://inter-static.skywatcher.com/downloads/mc020_firmware_0339.zip 以上内容均来自SkyWatcher官网 -> SUPPORT -> SOFTWARE&FIRMWARE -> Motor Controllers,可自行前往查看。2.2 更新固件 使用EQMOD线连接赤道仪和PC,打开赤道仪电源 打开电机控制器固件加载程序,如下图所示 勾选【Auto-detect COM Port】,点击【MC Version】自动连接到赤道仪电机的COM端口 点击【Browse】选择下载的最新版本固件(MCF文件),点击【Update】进行更新。 更新完成后,关闭赤道仪电源。
-
朗谬尔振荡和朗谬尔波 1 朗谬尔(Langmiur)振荡 1.1 限制条件 考虑温度可以忽略不计的非磁化等离子体,对于与电子相关的现象(即高频部分),离子由于质量较大无法及时响应高频振荡,因此可看作不动的正电荷背景。当电子相对离子发生小扰动时,设扰动产生的扰动电场$\mathbf{E_1}$。 下图中红点表示离子,蓝点表示电子。 忽略磁场$\mathbf{B}$的等离子体称为非磁化等离子体,相对地,考虑磁场$\mathbf{B}$的等离子体称为磁化等离子体。设$n_{e,i}$表示电子/离子数密度,$\mathbf{u_{e,i}}$表示电子/离子速度,$m_{e,i}$表示电子/离子质量,则电荷密度$\rho = e (n_i - n_e)$。 1.2 双流体方程组 由高斯定律可知 $$ \nabla \cdot \mathbf{E_1} = \frac{\rho}{\varepsilon_0} = \frac{e}{\varepsilon_0}(n_i - n_e) \tag{1} $$由法拉第电磁感应定律可知 $$ \nabla \times \mathbf{E_1} = - \frac{\partial \mathbf{B}}{\partial t} = 0 \tag{2} $$电子和离子的运动需要分开讨论,由于离子作为不动的正电荷背景,此处只考虑电子。由连续性方程可知 $$ \frac{\partial n_e}{\partial t} + \nabla \cdot (n_e \mathbf{u_e}) = 0 \tag{3} $$由运动方程可知 $$ n_e m_e \frac{\partial \mathbf{u_e}}{\partial t} = -n_e e(\mathbf{E_1} + \mathbf{u_e} \times \mathbf{B}) = - n_e e \mathbf{E_1} \tag{4} $$1.3 微扰法和平面波化 微扰法:离子作为正电荷背景,即$n_i = n_0$;设电子数密度由背景量和扰动量组成,即$n_e = n_0 + n_{e1}$。代入上述方程组,并忽略二阶小项,则方程组可改写为 $$ \left\{ \begin{split} &\nabla \cdot \mathbf{E_1} = -\frac{e}{\varepsilon_0} n_{e1} \\ &\nabla \times \mathbf{E_1} = 0 \\ &\frac{\partial n_{e1}}{\partial t} + n_0 \nabla \cdot \mathbf{u_e} = 0 \\ &m_e \frac{\partial \mathbf{u_e}}{\partial t} = -e\mathbf{E_1} \end{split} \right. \tag{5} $$平面波化:设所有的扰动具有指数项$e^{i(\mathbf{k} \cdot \mathbf{r} - \omega t)}$,即具有平面波的形式。利用$\partial/\partial t = -i\omega$和$\nabla = i\mathbf{k}$对上述方程组进行化简 $$ \left\{ \begin{split} &i\mathbf{k} \cdot \mathbf{E_1} = -\frac{e}{\varepsilon_0} n_{e1} \\ &i\mathbf{k} \times \mathbf{E_1} = 0 \\ &-i\omega n_{e1} + i n_0 \mathbf{k} \cdot \mathbf{u_e} = 0 \\ &-i\omega m_e \mathbf{u_e} = -e\mathbf{E_1} \end{split} \right. \tag{6} $$由$i\mathbf{k} \times \mathbf{E_1} = 0$可知$\mathbf{k} \parallel \mathbf{E_1}$,运动速度$\mathbf{u_e}$只考虑扰动电场$\mathbf{E_1}$方向的分量。则上述方程组进一步简化为 $$ \left\{ \begin{split} &i k E_1 = -\frac{e}{\varepsilon_0} n_{e1} \\ &i\omega n_{e1} - i n_0 k u_{e\parallel} = 0 \\ &i\omega m_e u_{e\parallel} = e E_{1} \end{split} \right. \tag{7} $$由上述方程组的第二和第三式消去$u_{e\parallel}$可得 $$ n_{e1} = - \frac{i k n_0 e}{\omega^2 m_e} \tag{8} $$将(8)式代入(7)式第一个方程,消去$E_1$、$n_{e1}$可得 $$ \omega^2 = \frac{n_0 e^2}{\varepsilon_0 m_e} \Rightarrow \omega_{pe} = \sqrt{\frac{n_0 e^2}{\varepsilon_0 m_e}} \tag{9} $$其中$\omega_{pe}$表示朗谬尔频率,也叫做(电子)等离子体频率。由群速度$v_g = d \omega/dk = 0$可知,该振荡只存在于振荡产生的位置,不会向外传播。 2 朗谬尔波 2.1 限制条件 当电子温度不为零且其他条件不变时,由于电子的热运动,可以将振荡区域的信息携带至邻近区域,从而使邻近区域也发生振荡。这样,发生在某处的振荡就能传播出去而形成波,这种波称为等离子体波或朗谬尔波$^{[1]}$。 [1] 《等离子体物理学》李定著,P92.2.2 色散关系 此时,高斯定律、法拉点电磁感应定律和连续性方程的形式不发生改变,运动方程中需要引入热压梯度项$\nabla p_e$,如下 $$ n_e m_e \frac{\partial \mathbf{u_e}}{\partial t} = -n_e e(\mathbf{E_1} + \mathbf{u_e} \times \mathbf{B}) - \nabla p_e = -n_e e \mathbf{E_1} - \nabla p_e \tag{10} $$由状态方程$p_e \rho_e^{-\gamma_e} = {\rm consts}$和$p_e = n_e k_B T_e$以及$\rho_e = -e n_e$,可得 $$ \begin{split} &\nabla(p_e \rho_e^{-\gamma_e}) = \rho_e^{-\gamma_e} \nabla p_e + p_e \nabla \rho_e^{-\gamma_e} = \rho_e^{-\gamma_e} \nabla p_e - p_e \gamma_e \rho_e^{-\gamma_e - 1} \nabla \rho_e = 0 \\ \Rightarrow & \nabla p_e = p_e \gamma_e \rho_e^{-1} \nabla \rho_e = \gamma_e k_B T_e \nabla n_{e1} \end{split} \tag{11} $$其中$k_B$表示玻尔兹曼常数,$T_e$表示电子温度,$\gamma_e$表示电子比热比(在绝热假设中,$\gamma_e = 3$;在等温假设中,$\gamma_e = 1$)。将上式代入(10)式,则完整的方程组可以写为 $$ \left\{ \begin{split} &\nabla \cdot \mathbf{E_1} = -\frac{e}{\varepsilon_0} n_{e1} \\ &\nabla \times \mathbf{E_1} = 0 \\ &\frac{\partial n_{e1}}{\partial t} + n_0 \nabla \cdot \mathbf{u_e} = 0 \\ &n_e m_e \frac{\partial \mathbf{u_e}}{\partial t} = -n_e e \mathbf{E_1} - \gamma_e k_B T_e \nabla n_{e1} \end{split} \right. \tag{12} $$平面波化后,上述方程组改写为 $$ \left\{ \begin{split} &i\mathbf{k} \cdot \mathbf{E_1} = -\frac{e}{\varepsilon_0} n_{e1} \\ &i\mathbf{k} \times \mathbf{E_1} = 0 \\ &-i\omega n_{e1} + i n_0 \mathbf{k} \cdot \mathbf{u_e} = 0 \\ &-i\omega n_0 m_e \mathbf{u_e} = -n_0 e\mathbf{E_1} - i k \gamma_e k_B T_e n_{e1} \end{split} \right. \tag{13} $$同样地,运动速度$\mathbf{u_e}$只考虑扰动电场$\mathbf{E_1}$方向的分量,将上述方程组化简为 $$ \left\{ \begin{split} &i k E_1 = -\frac{e}{\varepsilon_0} n_{e1} \\ &i\omega n_{e1} - i n_0 k u_{e\parallel} = 0 \\ &i\omega n_0 m_e u_{e\parallel} = n_0 e E_{1} + i k \gamma_e k_B T_e n_{e1} \end{split} \right. \tag{14} $$由上述方程组的第二和第三式消去$u_{e\parallel}$可得 $$ n_{e1} = - \frac{ik n_0 e}{\omega^2 m_e - k^2 \gamma_e k_B T_e} E_1 \tag{15} $$将(15)式代入(14)式第一个方程,消去$E_1$、$n_{e1}$可得 $$ \omega^2 = \frac{n_0 e^2}{\varepsilon_0 m_e} + \frac{\gamma_e k^2 k_B T_e}{m_e} = \omega_{pe}^2 + \frac{\gamma_e}{2} k^2 v_{the}^2 \tag{16} $$其中$v_{the} = \sqrt{2 k_B T_e / m_e}$表示电子热速度。上式即为朗谬尔波的色散关系,从(16)式可以看出,只有当$\omega > \omega_{pe}$时,朗谬尔波才能传播。
-
ZWO行星相机的选择 购买星特朗8SE之后,尝试了几次目视观星以及手机对着目镜拍摄,拍摄效果不是很好,因此决定购买一款不那么贵的行星相机。作为新手,根据网上数据整理了下ZWO部分行星相机的数据,以便参考。 需求分析 已有主镜为星特朗C8,焦比f/10,口径203mm 拍摄行星,主要目标为月球、木星等 画幅尽量大,以减少需要拼接的次数 ZWO行星相机 以下数据截止至2023年6月。型号类别画幅分辨率像素尺寸量子效率读出噪声满阱电荷帧率ADC价格ASI120MC-S彩色1/31280*9603.7568%4.0-6.6e13ke6012bit780ASI224MC彩色1/31304*9763.7575%-80%0.8-3.2e19.2ke15012bit980ASI662MC彩色1/2.81920*10802.991%0.8e38.2ke107.612bit1380ASI678MC彩色1/1.83840*2160283%0.6-2.7e11.27ke47.512bit2070ASI585MC彩色1/1.23840*21602.991%0.8e47ke46.912bit2580ASI290MM黑白1/31936*10962.980%1.0e14.6ke17012bit1430ASI432MM黑白1.11608*1104979%2.4e97ke12012bit3320 型号:“MC”为彩色相机,“MM”为黑白相机。 类别:彩色相机可以直接使用,适合入门;黑白相机需要搭配滤镜和滤镜轮使用,拍摄效果更好。 画幅:该参数越大,相机靶面越大,价格越贵。除了月球,其他行星都不需要太大的靶面。因此该参数取决于拍摄目标和预算。 像素尺寸:通常认为像素尺寸$\times$5=最佳合成焦比,最佳合成焦比小于望远镜焦比为欠采样,大于为过采样,相等为合理采样。比如ASI678MC,像素尺寸为2$\rm{\mu m}$,对应的最佳合成焦比为F/10,对C8来说刚好合适。 量子效率:通常认为该参数高的相机灵敏度会比较高。 读出噪声:每次图像读出来所固有的噪声,可以减小但无法消除。该参数越小,图像信噪比越好。 帧率:相机一秒钟能够拍摄的相片张数,以fps为单位。 参考 从入门到进阶,行星摄影详细教程4:如何挑选最合适的行星相机?
-
纵使困顿难行,亦当砥砺奋进 三月份的时候,和一行人骑行爬山,被拉爆了一路。被拉爆的过程中,思考了一些问题,加上最近心中多有烦闷,借这件事谈下自己的感悟。 通常情况下,自行车作为代步工具,速度不会特别快,风阻大多时候是可以忽略不计的。当速度超过20km/h时,风阻的作用就已经可以感受的到,如果此时还是大风天气,风阻的作用就会更加明显。这个时候,有人帮忙破风将会节省很多的体力。 骑行爬山的那次,除了上山的那段路坡非常大以外,路上还有很多的坡度不算太大的长坡。在平路骑行的时候,我可以混迹在大部队的中间位置,享受着前面人破风的福利,以很小的输出功率就可以跟上。但每遇到上坡,就会被迅速拉开距离。大致可以用以下公式来理解 $$ P_t = P_f + P_G + P_l + P_k $$其中$P_t$表示总输出功率,$P_f$表示克服风阻所需要的功率,$P_G$表示上坡克服重力所需要的功率,$P_l$表示克服摩擦力等损耗的功率,$P_k$表示动能增加所需要的功率。 假设初始速度为$v_0$,处于坡度为零且无风阻的真空环境,以匀速前行,那么总输出功率等于损耗的功率,而自行车的轮胎所带来的摩擦损耗很小,因此可以用很小的输出功率保持速度$v_0$不变。 假设初始速度为$v_0$,处于坡度为零的路面,以匀速前行,那么总输出功率等于克服风阻的功率和损耗的功率之和,在有人破风的情况下,克服风阻所需要的损耗可以大幅度减小,因此依然可以用很小的输出功率保持速度$v_0$不变。 假设初始速度为$v_0 = 20 \rm{km/h}$,处于坡度为$3\%$的路面,匀速上坡,那么总输出功率等于克服风阻的功率、上坡克服重力的功率和损耗的功率之和,我的体重+自行车的质量约为83$\rm{kg}$,可知上坡克服重力所需要的功率约为$135.57 \rm{W}$。对我这个菜腿来说,突然增加这么多的功率,只能勉强维持一会儿,很快就会被甩开。 那天除了有很多长坡,还是一个大风天气,当上坡过程被拉开距离,缺少了破风后,将独自面对所有的风阻,这样的状况显然是更加困难的。最终导致跟大部队的差距越来越大。 有句俗话叫做“福无双至,祸不单行”,生活中往往如此,当你遇到困难的时候,如果因此影响到心态而又无法很好的控制,在坏心态的加持下,将会招来更多的坏事。越是无法从困难中走出,越是会深陷困难的泥沼之中。 那天回来的路上,在一个上坡,我再次被甩在了后面,在绝望之际,有一个人从我后面超了过去,他的速度不是很快且明显还有余力,为了能够赶上前面的人,我强撑着追了上去,直到跟着他一起赶上前面的一个人。这时候,我知道以我的体力无法继续跟在这个人后面蹭风,就转而跟在刚赶上的人后面,他的速度稍微慢一些且体型较大,能挡住更多的风。最后在这个大哥的带领下,骑行了差不多十几公里,终于赶上了等待我们的大部队。当然,能坚持跟在大哥后面蹭风,还是因为中间他看到我跟不上主动放慢速度等了下我。 自这之后,清楚地意识到自己跟他们的差距,我也就没有再和他们一起骑行。与其成为累赘,不如人少一些,慢悠悠的、边骑边看风景。然而,大多时候环境不是我们能够决定的,当处于一个环境中,遇到了巨大的困难,你只有更加的努力、刻苦,才有可能摆脱这些困难。
-
使用Python调用Fortran程序 1 前言 网上关于Python调用Fortran程序的方法通常分为三种:1)基于f2py;2)生成动态链接库;3)生成可执行文件。 其中第1种方法在涉及到“祖传”代码时,通常会出现各种报错;第3种方法在进行数据传递时基本只能通过操作文件的方式,很不方便。 由于涉及Fortran程序时,一般都逃不开“祖传”代码,因此本文将介绍最为稳定可靠的第2种方法。 2 方法详情 2.1 示例代码 新建test01.f90文件,创建子例程sub_test01以及函数func_test01,详细内容如下 subroutine sub_test01(x,y,z) bind(C,name="sub_test01") use iso_c_binding real(c_double), intent(in), value :: x,y real(c_double), intent(out) :: z(2) z(1) = x + x z(2) = y*y end subroutine sub_test01 function func_test01(x,y) result(z) bind(c,name="func_test01") use iso_c_binding real(c_double), intent(in), value :: x,y real(c_double) :: z z = x + y end function func_test01 bind:用于声明外部调用时子例程/函数名称 iso_c_binding:Fortran自带的模组,必须引用 intent:声明变量属性,输入为in,输出为out,即是输入也是输出为inout c_double:变量类型,real对应c_double,integer对应c_int value:输入变量为单个值时,需添加此标记 2.2 生成动态链接库 与正常编译相比增加-shared,生成后缀为.so的文件,如下 gfortran -shared test01.f90 -o test01.so如果此步骤报错recompile with -fPIC,则在-shared后加上-fPIC。2.3 使用Python调用 调用sub_test01子例程,需要引用ctypes和numpy,示例代码如下 import ctypes as ct import numpy as np # 加载动态链接库 fortlib = ct.CDLL('test01.so') # 引用sub_test01子例程 f_sub = fortlib.sub_test01 # 声明变量类型 f_sub.argtypes = [ct.c_double, ct.c_double, ct.POINTER(ct.c_double)] # 输入变量赋值 x = ct.c_double(3) y = ct.c_double(4) # 输出变量初始化 z = np.ones(2) z_p = z.ctypes.data_as(ct.POINTER(ct.c_double)) # 调用sub_test01子例程 f_sub(x,y,z_p) print(z) 使用ctypes.CDLL(<so name>)加载动态链接库,其中<so name>为上一节生成的动态链接库名称 子例程的引用名称为上一节bind中name定义的名称 argtypes用于声明变量类型,其中ctypes.POINTER表示指针。当变量为单个值(Fortran代码中value)时,声明为相应类型;当变量为数组(或输出变量,即intent(out))时,声明为指针 ctypes.c_double(<value>),其中<value>为变量的值 打印结果为[6. 16.] 调用func_test01函数,与子例程调用方式基本相同,示例代码如下 import ctypes as ct # 加载动态链接库 fortlib = ct.CDLL('test01.so') # 引用sub_test01子例程 f_sub = fortlib.func_test01 # 声明变量类型 f_sub.argtypes = [ct.c_double, ct.c_double] # 声明结果类型 f_sub.restype = ct.c_double # 输入变量赋值 x = ct.c_double(3) y = ct.c_double(4) # 调用sub_test01子例程 z = f_sub(x,y) print(z) restype声明返回值的类型 打印结果为7.0 参考 python调用fortran的3种形式【f2py,动态链接库,os命令】 How to Call Fortran from Python Using Python as glue
-
2023-05-21 周日 晴转小雨 前些天听说武向平院士今晚会在武大老图书馆做一个《理解宇宙》的科普报告,便报了名。 今天下午4点左右,我们一行人集合出发。考虑到到地方没法吃饭,就提前在路边随便吃了点。路上下着小雨(很小的雨点,不打伞都行),凉风吹来,非常的舒服。 报告上,武老师以灵魂三问的形式向我们介绍了宇宙。从宇宙的年龄、大小等基本信息开始介绍,以哈勃红移和光速不变引出大爆炸理论,以元素的来源讲述恒星的归宿,最后以宇宙命运的主宰——暗物质和暗能量来畅想天文学的未来研究方向。 身在俗世中,总会被各种鸡毛蒜皮的事情所烦扰,偶尔仰望星空,思索宇宙的浩瀚,自身那些微不足道的烦恼仿佛也没那么重要了。 报告结束后,雨下得大了一些,在灯光的映照下,显得还挺好看的,顺手拍了下这偶然间的美丽。 WechatIMG39.jpeg图片