把照片加工成指定的宽高比例

1.要求和必要性

填表。填写有些表格是为了参加喜欢的会议,填写有些表格是被迫的,为了求生。有时还要填写各种汇总表格,这是希望我们站在更上位的角度上观察自己吧。

填表的时候,有时要提供照片。有时照片还要求指定的尺寸(包括文件大小,以字节为单位;也包括外观或打印的大小,以像素或厘米计算;有时包括DPI,每英寸的点数,清晰度)这些都容易用各种处理图片的工具加工,全自动的,指定参数就行。

以下面这张照片为例,摄于长春 世界雕塑公园入口。

偶尔照片要求宽高的比例,这说明接收照片的人是真的认真考虑问题了。因为如果不指定宽高比例,你提供的照片显示出来可能会横纵比例失真。像下面这样。

或者像下面这样。

对这一点我非常惊讶,在学校的毕业生照片收集系统里,在商场里面和外立面上播放的大屏幕上,经常有那人的横纵比例一看就不对。把16:9和4:3混淆的,更有甚者把新近的超宽的宽银幕播放在窄屏幕的。完全不顾及“锁定纵横比”这样的复选框,也不顾及观者的感受。我在练习画画的时候,对如何保证纵横比例一致相当苦恼,现在也没有找到好的办法,除了用铅笔测量长度。我希望更加精确,而不可得,难以理解别人是如何忍受这种程度失真的。

又或者,接收照片的人保证了比例,但是由于你提供的照片比例与系统打算用的不一致,所以就随便剪裁下来一块——而照片上哪里是重点,需要人类的参与才能体现意图。

下面这张

和下面这张

两张比例差不多,都是从原图上剪切下来一块,但是强调的重点,暂时还是由人类指定吧。

综上,要求为
(1)宽高比,有时2:3,有时4:5,有时3:4,等等;
(2)剪切的位置需要人工指定。

2. 工具

用 irfan view 容易处理。irfan view还可以用来看漫画,挺方便的。在这里 https://www.irfanview.com/ 下载。

3. 步骤

操作步骤如下。

(1)开始操作

Edit | Create custom slection…

(2)指定比例,可以指定宽和高的像素


通过Custom ration可以自定义比例,宽高之比可以用小数0.8或者分数4/5表示。上图中我选择了4:5表示宽高之比为4:5。

右侧的像素为按“Save and draw on image”后出现的提示框的默认大小。

提示框可以通过 鼠标右键移动位置,这样操作像素大小不变。

或者ctrl拖拽边缘,像素大小变化,纵横比例不变。

下图,我用鼠标右键操作提示框,移动了它的位置,没有改变它的大小。

(3)切去不要的部分

Edit|Crop selection(Cut out)

结果如下图所示,黑色背景是图片以外,是不存在的区域。

(4)保存

此时可以根据系统对图片字节尺寸的要求选择压缩比。

在文件资源管理器中看保存出的图片属性,宽高的像素以及比例符合期待。

 

锻炼十年(6)器械

这是2018年开始写的一个系列,当时命名为《锻炼十年》,从2008年每天俯卧撑开始计算。如今又5年过去了,有些新的体会增补进来。为保持名称一致,仍称为 锻炼十年。

之前写过了伤痛,这一篇讨论 器械。

当年在健身群还是同学们的群里聊起锻炼,或者打卡。有同学提到,老师你还有动感单车,我们在宿舍什么都没有。虽然我成天锻炼打卡,但是我的锻炼中绝大多数都是自重训练,不需要任何器械。

骑车需要有车,如果不是固定的自行车,还需要车道和气候条件。跑步需要跑道,游泳需要泳池,各种球类需要场地。对抗性的运动都还需要一个因素,足够年轻。如果需要这些条件才能训练,我早就放弃了。

所以,虽然我下面要写这么多器械,然而它们并不都是必要的。前十年除了自重,几乎都没有用到别的装备,后五年也仍然以自重作为最主要的训练。瑜伽垫、哑铃、引体向上架,是常用设备,其余的使用不频繁。

(1)自重训练

自重训练,只需要体重。当然,运动专家们指出过自重训练的缺点,自重不易调节,对力量专业训练或者发展不利。可以用引体向上作为示例,很多人一个也拉不起来,因为没有成就感,训练不易坚持。不过,如果不太追求效果,像我,那么就无所谓,仅利用体重的自重训练就足够好。

不妨把如何使用自己的体重,从各种角度锻炼不同肌肉,把这些当成一道思考题。查查资料,学习理论,没事琢磨,乐在其中。

学习解剖学,了解动作对应的肌肉和骨骼。比如 https://book.douban.com/subject/26863470/

有些基本原则,可以帮助在自重训练这样受限条件下,训练更多的肌肉,达到更好的效果。比如 制造不对称(单侧),不稳定(弹性支撑),难度变化(高度、负重、弹力带),动态(爆发)。参见 https://book.douban.com/subject/26739524/

自重训练要小心别受伤。自重训练看起来简单,因为我们会误认为大家都能轻松抬起自己的身体。但是自重训练的很多动作是特意设计出来难为我们的,是专门把大重量加在小块肌肉上,或者以别扭的姿势限制某些肌肉发力,从而使目标肌肉得到更多机会更大负重的训练。不仅需要力量,数量也会带来质变。能做一两个,和连续12个,做上几组,是有非常大区别的。在最初做腹肌训练时,尽管当时能够连续100个仰卧起坐,但是练腹肌的那些刁钻动作,我仍然疼到每做一个就破口大骂教练。因为这些动作并不像表面上看起来那么容易,如果不小心谨慎,保持只在头脑清楚的情况下训练,受伤也是分分钟的事。拉伤肌肉,摔伤或者碰伤,在我身上都发生过,往往因为托大,或者练的时候头脑不清楚。

自重训练可以辅以哑铃或弹力带加负重,但是应保持小心,不要冒进。动作能轻松完成前,不轻易加负重;加负重以后,并非只进不退,偶尔降级有利于心态,也有利于体会动作。

即使不需要除体重以外的任何器械,仅徒手,甚至去除有难度的动作,每天专门锻炼的时间,如果强度大,也很难超过半小时。集中训练上肢推、上肢拉、下肢、核心,肌肉都很难承受半小时以上“足够”强度的训练。不然恢复时间长,容易达到一周以上,会影响下一周的训练。另外,即使肌肉可以承受,每天超过半小时,工作、学习、家庭被挤占的严重程度可能也难以承受。每天例行锻炼如果强度达到剧烈,那么也就能坚持十几分钟。想想一千米达标跑,即使肌肉能够承受,心肺的压力也相当大。过重的负担对意志有太高的要求,加上进步来得没有想像中快,痛苦一段时间以后就会放弃了。

为降低放弃的风险,宁可减少训练量。只要不受伤,动作不标准也没有多大问题,慢慢会进步的。教练要求不要这样,不要那样,要做到什么,又要做到,那都是完美状态,这种状态可能在你练这个动作三年以后才能达到。没有足够力量的时候,就是做不到的。这不以人的意志为转移,与你的意志品质(挺住!),道德修养(腿不要懒!)都没有任何关系,单纯就是因为太难。如果你感觉疲劳或者困难到不想练了,那就是曲线过于陡峭。广播体操那种强度对很多四十以上的人群而言,也相当不易。只要能让你坚持下去的强度,眼下每天只练半分钟也无妨,强过明天就放弃。

除了参考示例的那些有名字的动作以外,考虑在何种情况下能够达到类似的发力条件。我第一次感觉到大腿后侧肌肉发力,与所有看到的示例都不同。当时坐在椅子上,向前伸腿,微屈,搭在地面上。用力向下向后拉,这样感觉到了大腿后侧发力。以后就容易在各种姿态下找到类似感觉了。

根据解剖学,可以躺在床上锻炼 腹肌、后背、大腿后侧。发力到发抖以前,虽然姿态没有变化,但是肌肉也可以相当紧张。用桌子可以练腕力和腹肌,静态保持造成的压力就相当大。类似的,用墙锻炼推的动作,地板锻炼大腿外张、内收,站立时锻炼小腿,开会时坐椅子上发力把自己微微抬起来,向上推门框辅以随动作被动下蹲可以锻炼肩的中束和前束。

在生活中,有些动作力量并不大,但是可以徒手体会发力的感觉。画画时体会大关节和大肌肉更稳定,推拉重物时体会下肢发力,刻木头时体会控制和杠杆。隔一段时间由负重转为徒手,降级练习,也同样有利于感觉发力的肌肉和体会姿态控制。

我所练的动作,一些来自 keep,动作、节奏、组间休息都照着练,并且用以作为记录。

另外还有些动作,以及解读是根据一些书学到的。这是我建的豆列 https://www.douban.com/doulist/41556500/ ,我的理论主要是从这里学到的。

(2)瑜珈垫

瑜伽垫是必须的,因为不少动作需要膝或肘支撑。站立的动作如果有瑜伽垫,也可以不穿鞋。俯卧撑徒手不用架子的时候,有瑜伽垫的话也能避免手掌和地面硬碰硬压得实成平整疼痛。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\f6d5f5c3932ced531cfe9aeb2ffa6af.jpg

如果短时间出差,没有瑜伽垫,也没有椅垫或厚毛巾拆下来代替,就只能练些别的动作了。

我用过三五个瑜伽垫,有的总被踩蹬,后来表皮就脱落了,只能扔掉。有的薄,缓冲保护作用就较小。有的厚,软和,然而向两边或向中用力的时候会拉伸或收缩。特别是空气干燥寒冷的时候,瑜伽垫在地板上的摩擦力会变得小很多,打滑。男士购买瑜伽垫需要考虑身高,有些瑜伽垫太短,没法手脚一起放在上面,也窄,不能做宽距俯卧撑。我经常把两个瑜伽垫叠起来用,希望能降低万一有噪音对楼下的影响,踩着脚感也不错。长期使用厚的瑜伽垫,换成仅穿鞋站地板上的时候,发现单腿平衡容易了很多,例如单腿硬拉。

每次训练瑜伽垫上几乎都很多汗水。有一段时间我在练keep的时候常拍照瑜伽垫上汗水形成的人印儿,作为锻炼的图片上传。瑜伽垫上经常滴汗,可能材质的原因清洗效果也很一般,还是有痕迹。可能还是由于材质的原因,细菌和真菌难以滋生吧,擦干以后不捂着能透气,倒是一直也没有气味。

还有仅分别支撑一个膝盖这么大范围,比巴掌大不了多少的(橡胶?)垫。膝支撑的动作,例如膝支撑健腹轮,用着比瑜伽垫要方便。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\260de63535bf6d2b4ec422f079d2b97.jpg

(3)哑铃

哑铃并不需要太重。一方面上肢训练中需要负重较高的动作,可以用体重代替;另一方面,需要哑铃的很多动作,要练的肌肉弱到没有能力拉起太重,并且那些肌肉往往需要小重量多次数。此外,我也没有练大肌肉这样的雄心壮志。

我的哑铃中最重的,6.5kg*2。是当年在柳园BBS买的,应该是我经历的最早网购吧。卖家是向龙,我去拿哑铃,他看是我死活不收钱,我死活要给。记得后来以30元还是20元成交。接近二十年以后,邦哥带我去迪卡侬现场买哑铃练肩,我非常惊讶,原来哑铃这么贵,当年向龙所收的数额只是象征性的。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\f30908666f9fff9a0da717ea1432cdc.jpg

6.5kg*2哑铃里面是沙子,所以看起来非常大。每次有人要试的时候,我都要特别叮嘱,非常轻,千万小心别闪到。就像初中时化学老师在让我拿起水银瓶子的时候反复叮嘱,非常沉,非常非常沉。这对哑铃设计的是可以更换里面的内容物,而且现在也没有填满。但是我从来也没能旋开过,而且起初十几年我举不起来,各种姿势都非常困难,几乎没有练。七年前才开始频繁使用。等到我终于觉得这俩哑铃不是特别重的时候,更重的哑铃对我已经不太迫切了。

迪卡侬的哑铃是3kg*2的,邦哥带我去现场买的那对。他告诉我,哑铃别网购,死沉所以运费贵。而且,你需要现场试一下找找感觉。我当时想要练肩,邦哥说你侧平举不太费劲,也别勉强,能做几个就行了。我当时雄心勃勃地注意到他后面的话,他说,以后厉害了可以再换新的。6年过去了,没有换新哑铃的必要,虽然侧平举很轻松了,俯身侧平举也终于不艰难了。

3kg*2就只是练肩而已,练其他的动作要么太轻,要么太重。练肩每周只有一天而已。我懒,并且有其他训练和事务。即使不懒,练肩也只能每周两到三次而已,天天练的话肌肉恢复也成问题。大多数器械的命运也就是这样,没法做到利用率非常高,除非有好几个人一起用。所以,如果器械让你感觉总是落灰,不要内疚,就是这样的,只能这样。

还有1kg*2哑铃。有两套,最初是二猫妈和二猫的,我现在常常用来练俯卧天使(上举Y字-侧平举T字-向下伸展A字)。我的巅峰能做20个引体向上,现在做15个尚有余力。但是我在俯卧天使时使用1kg*2哑铃已经达到极限,3组*12个就满身汗。几年前,俯卧天使徒手做,或者徒手的TW伸展、徒手的YW伸展,都异常困难,做几个就满头满脸汗。肩胛(或肩袖?)附近的肌肉太弱了,并没有进化出承受大重量的能力来,小重量多次数练到能在引体向上拉动作时等长固定住肩胛就足够强大了,那个时候不能指望它们主动收缩把体重拉起来。

出差没哑铃的时候,我用过行李箱,书包,矿泉水桶或者水瓶。也用过水桶、油桶。粗细适合抓握角度也适合的不容易找到,不过强于没有。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\e345aaf1f77d139fe5eec9e0fdc45cb.jpg

(4)弹力带

我有一大堆弹力带。这东西不占地方,不沉,出差也容易带着。据说还有诸多好处,比如不会受到哑铃惯性的困扰;可以始终与动作发力的方向相反,越是动作末端负重越大,而不像哑铃会由于关节旋转导致阻力变小甚至消失,或者阻力的分解与肌肉的方向夹角有变化。

我的弹力带有2类。一种是扁平的,橡胶材质。粉红的,是二猫以前练舞蹈时用过的,最轻。被我扯断过一根,后来又照样买过。面拉,Y字伸展,我在这种强度的强力带上停滞了不止一年。现在也经常回到这种阻力下或者徒手再试,感觉肌肉发力,以及不同负荷下的动作变型和发力差异。蓝色的,是迪卡侬的,扯断过一根,现在的这根是两根打结连结的。橡胶很涩,随便打结以后非常稳定,没有脱开的迹象。黑色的,最重。在最初狂妄的时候我用了一段时间,后来知道动作大多是变型的,没有练到目标肌肉,被更大的肌肉(因此也需要更强度的阻力才对)代偿了;姿态扭曲,还容易受伤。黑色的,拉断过一次。这种弹力带也能和哑铃在一起练,手臂屈或下肢站起时同时对抗二者的合力。已经有几年没有这样做过了。

另一种弹力带是截面圆形,外有保护的编织物,两个末端反折成环,可以连接快挂,用来通过(那东西叫什么来着,像个又粗又厚的海绵圆环)阻力装置钩住房门和门框上方,钩住门把手,或者挂住握柄。橙色20LB最练,现在最常用,练面拉和Y字伸展。黑色的,双折,有时候用于硬拉或俯身(有时坐地上)划船的阻力。

与弹力带类似的,我还有个拉力器,中间金属弹簧连接,两边有方形握环。是大学毕业的时候同学给我留下的宝物,他们希望我能不用背阔肌而仅靠肩胛T字伸展平拉开4根还是5根全部弹簧。兄弟们,至今未能做到,估计以后也够呛。

(5)单杠

室外能找到的单杠越来越少了,原来的一些也拔掉了,换成老年人锻炼的器械。最像单杠的,高度到我的胯骨,用来压腿的?可以杠下屈体,就这样向上拉。整个大学校园,也只能找到两三处。经常一头儿比另一头高,两肩受力不均。通常较细,握着手疼。

家里的单杠,一种是两端有硅胶,通过旋转变长挤压在门框上。握住时要注意用力的方向,别把单杠旋松了。所以我大多数时候只能正握,不能反握,反握会放松单杠。换脸的朝向,空间有限,最高点可能撞到门上方的墙上。

伤门框,我家的门框外的墙已经裂纹了。而且危险,看过在从杠上掉下来摔脑袋的视频以后,二猫妈严令我只能练脚朝下的动作,不得L支撑之类的,更不得把脚抬到头顶什么腿绕身体旋转,否则就把单杠拆了。不敢爆发性拉起,怕掉下来。好在这样的需求也不多,肩胛难以承受。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\80fbfd0e5d593563993fe44b6813d99.jpg

另一种是固定在墙上的,用膨胀螺栓。看起来结实很多,爆发性拉起时也能听到金属的声音,不过似乎并非脱落的征兆。也要小心。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\253b12845ee2f1f48e1a9722ec7e8c8.jpg

我只有这两种单杠。能起到类似作用的设备,还有一根1.5米左右的横杆,通过8号线铁丝临时挂住,可以做脚在地上的仰卧划船。因为杆会转,我的手握力远远不够,所以选择阴阳握,一只手正握,一只手反握,做一半数量再换过来。练完以后从8号线上摘下来。即使团身压上全部重量,人也没有多沉,8号线甚至没有变型的迹象。

还见过室内的内杠,有底座支在地上的,是个架子。架子稍微小一点就挤得慌。即使小架子家里也没有那么大地方,置办不了。

我握力不够,或者手嫩,通常都戴手套练。杠子会因此粗一些,没觉得握住费劲。带胶点的劳动手套最好。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\cfc0f5702dafb7397032fda70e8dc40.jpg

(6)动感单车 和 跳绳

原来双手能计心率,不知道准不准,显示在面板上。面板上还显示速度什么的。没多久面板进了汗水坏了。花钱买了个面板,不匹配。

索性把面板拆了,心率用心率带,速度用室外骑车的计速器。心率带用腕表样的装置查看,后来氧化变性,手表带和心率带的带子都断了。不便宜,没有再购置,改用手环计心率,知道不如心率带准确,而且需要扎紧一点。改为主要以心率作为度量指标以后,连计速器也不用了,速度、负荷,都不重要了。保持目标心率,按预期持续时间,一定满身透汗前胸尽湿。

脚蹬上原带还有个装置,避免脚从蹬子上脱落,还能在提脚的时候也把力传导过去。这个物件有个名目,有专用术语,室外骑车有人因为没及时挣脱而摔伤。我不习惯用,拆了扔了。

骑的时候有时在面前支起个显示器。看电视不行,有些没意思,有些没字幕听不懂。看火车头拍摄的风光片,好像自己就是火车的动力,非常带感。几分钟的骑行计划不值得这样折腾,如果骑半小时,还是很有意思的。

每周骑不上一次,时间不允许,体力也经常不允许。所以,对落灰和闲置不要有负罪感,这是正常的,几乎人人如此。只要练了,就是收获,至于没练,不要心疼和内疚,这种心态不利于继续。我能做到的就是不在上面挂衣服,因为要练的时候摘衣服的这半分钟会阻止我继续。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\f69a6c50c5140f089f2fd94f8cf51bc.jpg

跳绳也练心肺,不过只能在室外,需要下楼。我喜欢登三轮跳法,二猫说中考不算成绩,必须得双脚蹦。刚开始我就能跳到及格,后来也还是这样。二猫最初只能跳几个,后来及格容易,优秀难以达到。后来参加了培训班,几次以后就每次都能超过优秀了。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\b69f1ce69169278e9a1f2b5e77a6d29.jpg

(7)俯卧撑架

我有一对S型的,下沉时能更深一些。据说也能避免伤到手腕,因为发力的角度与手掌支撑的俯卧撑不太一样,手腕更直一些,有架子时拇指和手掌间的夹角受力。我的体会是练多了都疼,各有各的疼。

需要小心一点,别在撑起来的时候歪了摔倒。我没摔过,但是一直小心着。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\dee34653ac239e8aced602b2df9966c.jpg

(8)空杆

空杆对我最主要的用途是 深蹲时上举,差不多就为这一个动作。我臂长,肩的柔韧性差,需要1.5米左右长的直杆,短了的话手扣不住。这么长的杆不太容易买到,拖布等常用器械一般没有这么长。最好的是邦哥推荐的白蜡杆,1.8米,可兼练大枪拦拿扎。也用PVC管,更容易找到。软,掰起来阻力不够,不过对手腕更友好一些。

好的杆子都不在身边,手头上有个临时用的。3块钱买的,缠上碎布免得硌手。练身体横向扭转的时候这杆受剪切力轻微地咔了一声,估计有暗伤,可能哪天就断了。果然锯开的木杆不行,需要天然长成的。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\42bedae6784ed76b887a6e6cc405011.jpg

(9)健腹轮

练腹肌的。目前只能膝上支撑,脚支撑漫漫无期。

(10)算筹

练的时候集中注意力在动作上,加上每天每周练的内容差不多,如果没有计数工具,经常忘了练了几组,有没有达到目标。用疲劳程度什么的帮助判断第几组,根本没有用处。

我用方便筷子截断作为算筹,练一组摆一根。再无忘数的担心。

也用keep,找个目标肌肉差不多的动作,不分左右(不然选起来太麻烦),用来计数或者计时。

(11)篮球,网球,硬质网球,狼牙棒 等

篮球,原本是二猫上小学时要求买的,两个。现在我练平板撑或侧平板的时候用来作为下肢或上肢不平衡的支撑。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\421a796d6724d4fb45846215c74ad5c.jpg

狼牙棒,用来滚后背按压。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\67051f6a287a8703ff006cd14e98f14.jpg

网球和硬质网球,用来疼的时候按压。

还有个keep的蓝色小球,也是用来按压的。这些用的机会不多,需要的时候很有效。还有像夹子一样按脖子的。其余的电动敲击工具,都过于柔和,平时用不上,疼的时候没用。

C:\Users\young\Documents\WeChat Files\wxid_mkn03idldug522\FileStorage\Temp\955987f67fa0cfefdc12ef8b8db48c3.jpg

(12)附,更正上一篇

我上篇提到 饭后老打嗝 举铁。他指出,那不是举铁。我还弄不清楚其中这些区别,对我仍然过于精微,录原文如下,算作对以前错误的更正。

> 饭后老打嗝 健身群:
> 不过我要稍微更正下,我的锻炼方式不是举铁,是在某个动作下能调节负重的训练,且以复合动作(多关节协调)为主
>
> 杨贵福:
>
>
> 杨贵福:
> 这种,我以为就是举铁呐
>
> 饭后老打嗝 健身群:
> 哈哈,举铁在我这是用哑铃或者杠铃的单关节健美训练
>
> 杨贵福:
> 还是举铁的,我都叫举铁
>
> 在下一篇器械里面,我更正一下
>
> 饭后老打嗝 健身群:
> 我也经常自重练习,比如联动全身的手臂外旋外展,短跑训练里腿部的原地提拉下压,这个有空就做,不用担心训练量
>
> 饭后老打嗝 健身群:
> 负重的刺激力量增长,不负重的调节体态、熟悉动作模式,都挺重要
>
> 杨贵福:
> 我现在能体会到不负重的情况下熟悉动作模式了,挺有用的。以前以为没啥用,以为是偷懒呢。

 

按页分割pdf文件为多个

本文介绍把单个pdf文件按页分割为若干个的方法

按页分割以后的每个pdf文件含有1页内容。选择这些pdf中的部分,按 多个pdf文件拼接或合并为单一文件 https://zhuanlan.zhihu.com/p/655675268 的方法,就可以实现从某个pdf文件中选择任意页面重新组合为新的pdf。

方法1 ImageMagick

ImageMagick https://imagemagick.org/ 有个工具convert,适合做各种格式转换,也可以用于切割PDF文件。

用法示例如下,命令行:

c:\tools\ImageMagick\convert -density 300 input.pdf[1] x-%0d.pdf

c:\tools\ImageMagick\convert -density 300 input.pdf[1-3] x-%0d.pdf

c:\tools\ImageMagick\convert -density 300 input.pdf[0] x-%0d.jpg

其中

(1)c:\tools\ImageMagick\convert 是可执行程序及所在路径;

(2)-density 300 是分辨率,单位DPI 像素每英寸;

(3)input.pdf 是待分割的输入文件;

(4)input.pdf 后面的[1]或[1-3] 方括号中是提取的页码或页码范围,从0开始计数;

(5)x-%0d.jpg 是输出的一系列文件的命名规则,x- 1位数字 .jpg。

下述指令

c:\tools\ImageMagick\convert -density 300 input.pdf[1-3] x-%0d.pdf

会提取 input.pdf 的第1、2、3页,生成如下新文件。

x-1.pdf
x-2.pdf
x-3.pdf

方法2 GhostScript

另一个方法速度更快,生成文件更小,文字可选。使用工具是 GhostScript,简称gs,在https://www.ghostscript.com/ 下载。

用法示例如下,命令行:

"C:\Program Files\gs\gs9.55.0\bin\gswin64c.exe" -sDEVICE=pdfwrite -dSAFER -o output.%00d.pdf input.pdf

"C:\Program Files\gs\gs9.55.0\bin\gswin64c.exe" -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output%00d.pdf -dFirstPage=1 -dLastPage=3 -sDEVICE=pdfwrite input.pdf

"C:\Program Files\gs\gs9.55.0\bin\gswin64c.exe" -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output%00d.pdf -sPageList=1,2,4-7 -sDEVICE=pdfwrite input.pdf

其中

(1)命令 "C:\Program Files\gs\gs9.55.0\bin\gswin64c.exe" 是在我机器上可执行程序的路径和文件名;

(2)输出格式等 -sDEVICE=pdfwrite -dSAFER 和 -dNOPAUSE -dQUIET -dBATCH 等,原样照抄,我们不讨论这些细节;

(3)输出文件 -o output.%00d.pdf 或 -sOutputFile=output%00d.pdf输出文件的一系列文件命名规律,这里是 output. 至多2位数字.pdf;

(4)提取页面范围 -dFirstPage=1 -dLastPage=3 或 -sPageList=1,2,4-7,分别指定起始页第1页(从第1页开始计数)、最后一页(第3页),或者 1,2,4-7 表示 第1页、第2页、第4页~第7页;

(5)输入文件 input.pdf。

附,合并多个PDF文件的方法在这里 https://zhuanlan.zhihu.com/p/655675268

 

多个pdf文件拼接或合并为单一文件

多个pdf文件拼接或合并为单一文件,偶尔会有这样的需求。

有时候是收到一大堆pdf,要打印。一个个打开,再一个个打印,需要坐那儿半天看着和操作,不够优雅。有时候是有一大堆pdf,要结集再发送给别人。

方法1 ImageMagick

ImageMagick https://imagemagick.org/ 有个工具convert,适合做各种格式转换,也可以用于拼接PDF文件。

用法如下,命令行:

c:\tools\ImageMagick\convert.exe -density 300 1.pdf 2.pdf 3.pdf 4.pdf output.pdf

其中

(1)c:\tools\ImageMagick\convert.exe 是在我机器上的路径和可执行程序;

(2)-density 300 是打印的分辨率,每英寸300像素;

(3)1.pdf 2.pdf 3.pdf 4.pdf 是输入的待合并的多个 pdf 文件;

(4)output.pdf,最后一个参数,是输出的单一文件,合并的结果。

这个方法的缺点不少。速度慢,需要几分钟。生成的文件大,比待合并的多个文件尺寸之和大不少,几倍几十倍都有可能。 即使输入文件中的文字可以选择,输出的文件中的文字也不能选择,像纯图片生成的。这也是尺寸变大和速度慢的原因吧。

这一方法的更多细节可以看这里 https://blog.csdn.net/u013919171/article/details/113520520

方法2 GhostScript

另一个方法速度更快,生成文件更小,文字可选。使用工具是 GhostScript,简称gs,在https://www.ghostscript.com/ 下载。

用法如下,命令行:

"C:\Program Files\gs\gs9.55.0\bin\gswin64c.exe" -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=output.pdf 1.pdf 2.pdf 3.pdf 4.pdf

其中

(1)"C:\Program Files\gs\gs9.55.0\bin\gswin64c.exe" 在我机器上的路径和可执行程序;

(2)-dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite 原样照抄,我没有细看;

(3)-sOutputFile=output.pdf 是输出的单一文件,合并的结果;

(4)后面的所有参数1.pdf 2.pdf 3.pdf 4.pdf是输入的待合并的多个 pdf 文件。

更多细节参见这里

https://superuser.com/questions/54041/how-to-merge-pdfs-using-imagemagick-resolution-problem

补充

如果要打印的是多个word,又或者这些word需要A3纸,而我没有这么大的纸。在这种情况下,我把这些word分别打印到pdf文件。此时不需要缩放,只需要注意不超出边界。打印得到的多个pdf文件拼接/合并为一个pdf文件,打印这个单一pdf文件到打印机时缩放到A4纸。

 

用Excel手搓傅里叶级数(2)

3. 傅里叶级数

上一节,我们验证了 不同周期的正弦函数之间、不同周期的余弦函数之间、正弦函数和余弦函数之间都是正交的,因此可以在傅里叶级数展开时作为 基底。不同幅度的这些函数相加,就可以收敛于某个周期函数。哪个周期的正弦函数、哪个周期的余弦函数 所对应的幅度,也即乘以这些函数的系数,是我们要求取的傅里叶系数。

公式大概长得像下图这样。

C:\Users\young\AppData\Local\Temp\WeChat Files\cb13597322042933dd673dde58f466b.jpg

其中a0是常数项,也可以视为cos(0),(根据不同定义)可能乘以一个系数;

与余弦对应的系数是 ai ;

与正弦对应的系数是 bi ;

3.1 傅里叶级数,展开,验证

书中的例子,需要展开为傅里叶级数的函数周期为T=1。

(1)原理,以及准备各个函数对应的数据

根据T=1

以及 角速度ω=2π/T

ω=2π/T=2π

以上备用。

我们可以跳过 傅里叶系数是待展开函数在各个基底上的映射 这一原理,查到公式如下。

上式中,n与i同义,指不同角速度/周期的正弦或余弦所对应的一个系数。我们能够注意到 an与余弦cos对应,bn与正弦sin对应,其余形式完全相同。

上式中的方框,在cos和sin之后的那两个方框,内容是 n*ω*t。

把上面备用的

ω=2π

T=1

代入到上面两个式子中,以bn为例得到下式。

an的形式非常类似,仅把sin改为cos。

得到上述公式,距离在Excel中实施只差一步。

这个定积分形式与上一篇中我们所见到的 黎曼和 形式求不同周期的、正弦函数、余弦函数间的相关性的公式非常相似。相似到不过是换了函数而已。验证基底相关性为0时,我们所用的两个函数分别是sin,cos之类的,现在用的是 f(x)和sin。再乘以一个系数,这里是2。

我们回到上一篇中的下面这组数据,对它做傅里叶展开。

这样,我们得到待展开的函数对应的数据。

在上一篇中,我们已经求出 角度、弧度、sin(t)、cos(t)。

按同样的方法,保留角度、弧度,我们求出 sin(2π*n*x)和cos(2π*n*x),其中n取1,2,3,4,5。

如下图所示,是当n=3时,以弧度作为x,绿框所在的这一列是sin(2π*n*x)。

这样,我们得到共10列不同周期的正弦和余弦函数对应的数据。

常数项,即 a0,书中的作法是 常数项也是个函数,其数据为值为 y=SQRT(2)/2 ,即0.707左右,的直线。与其他教材上 a0的定义不同,结果是等价的。

这样,我们有了常数项的函数所对应的数据。

现在,我们有了

待展开的函数 所对应的数据 (波);
10列不同周期的正弦和余弦函数 所对应的数据;
常数项的函数 所对应的数据。

以上,在Excel中共12列。

(2)傅里叶系数

我在Excel中隐藏无关的行和列,仅展示 b3这一系数的求取过程。

第一步,求得每一行,即黎曼和中的每个横坐标变化所对应的y。如下图所示。

其中G6是此前做好备用的 sin(2π*3*x)的第6个数据,
N6是待展开函数 的第6个数据,

这一行的结果暂存在b3列的S6单元格。

乘以1/1000,是因为我把整个一周期内的波形等分为1000份,因此每一行对黎曼和的贡献是1/1000。

如果忘了黎曼和,可以回顾下图,在上一篇中出现过。当时用于求内积,这里用于求傅里叶系数。

把b3所有行累加,再根据下图中的公式乘以2。

得到b3这个系数的值,如下。

值为0.424400615。

用同样的方法求出11个系数。

(3)验证

我们只使用当n=1时sin(2π*x)和cos(2π*x)这两个三角函数,因此傅里叶只涉到 a1,b1,以及常数项。这样得到的结果,在下图中表示为 “傅里叶 I”这一列。

“傅里叶 I”这一列的第一行,那个公式的含义从左向右为

蓝色 b1参数* 红色C3 正弦函数 +
紫色a1参数*D3余弦函数+
粉色a0*M3常数项函数。

验证一下对不对。如下图所示,蓝色是待展开的函数,橙色是“傅里叶 I”展开。

看起来好像对,又好像不太对。两个函数看起来有点像,但是区别又很大。

我们把更精细的傅里叶级数也加进来,得到下图。

其中绿色的,是n=1至n=5 傅里叶 V 级数展开的结果,有点像了。而且与刚刚的傅里叶 I级相比,肉眼可见像得多了。

但是我们可能会注意到一个问题,从I级到V级,一共应该有5条曲线,为什么这里只画了3条呢。有帖子提到方波(可以扩大范围至奇函数)的所有sin参数(和cos中的偶数周期倍数)非常小,小到接近0。所以,在这个例子中,每两级傅里叶级数波形极其相似,I被II覆盖,III被IV覆盖了。

不仅理论如此,在实践的数据中我们也可以看到,除了b1,b3,b5这三组,其余的都贡献微小。

肉眼看到的结果不足够有说服力,我们可以再求 均方差。方差越大,展开得到的波形与原函数就越不相似。

先求出每一行的差。我隐藏无关的行,在Excel中看起来如下图所示。

然后得到 差的平方。

最后对 差的平方 求均值,得到均方差。

对I,III,V三个级别的傅里叶展开求均方差。如下图所示,我们能够看到均方差越来越小。这表明,傅里叶级数越高,得么的曲线与原函数越接近。与我们肉眼的感觉是相同的。

(4)换周期,换采样间隔,换原函数

调程序的一大乐事,是在程序写完以后,修改代码,测试不同效果,或者反复程序,居然还不崩溃。在Excel里手搓傅里叶级数也一样,折腾各种变化很有意思。

书里的周期是1,我们换一个。

根据周期T=1求得ω,并把T和ω代入公式,得到下式。

制备出各个周期的正弦函数和余弦函数,备用。

制备出各个傅里叶系数,备用。

每一行。

上图中,每行的贡献为 1/1000*T = 1/1000*2π.

求黎曼和。

验证一下。

周期不同,看不出来什么区别,不够炫酷。

换采样间隔吧。1000份真是很多,翻页需要好久,如果在Excel中不隐藏数据行的话。改为20等份。

以下,周期使用 2 pi,未展开说明。

穷举弧度时,要说明等分为20而不是1000。

求傅里叶系数时,每行贡献1/20而不是1/1000。

其余不变。绘图验证,只有20个点,瘦骨嶙峋,果然看起来漂亮很多。

换个原函数。修改“波”这一列数据,改变原函数。瞬间Excel就给出新的傅里叶展开。

再换个原函数。

再换。

这个过程非常过瘾。改一下波形数据,对应的傅里叶级数就同时跟着变化。夫子步亦步,夫子趋变趋。

4. 待续

还可以有些展开,也非常有趣。不过,那些已经不应该在 用excel手搓傅里叶级数 这个故事中了。我们在以后的故事里再继续。

(1)傅里叶变换,模和幅角

谐波的强度为 sqrtp(a^2+b^2)
幅角为 cos (arctan (-b/a))

因此,可以把每对 cos 和 sin 转换为 只用cos。

这样就把原函数变换到了频域上,完成了傅里叶变换。

仍然可以用Excel求出(不是无穷级数的)结果,与其他工具计算的结果对比。

(2)用Geogebra绘制动图,圆周与傅里叶级数展开,本轮和均轮

我们可以使用Geogebra绘制出 红色大圆之上的绿色中圆之上的蓝色小圆上某个点的轨迹。红、绿、蓝三个圆的周期和半径不同,对应了不同的傅里叶级数。

改变横坐标,可以看到红、绿、蓝三个圆转动导致纵坐标描绘出方波。在红圆的圆心,我们可以看到蓝紫色的“行星”轨迹,像火星一样忽快忽慢,有时倒退。

怎么把这个效果做出来呢?

(3)快速傅里叶变换FFT

因为FFT求系数数的时间复杂度更低一些,所以有可能在Excel中手搓出相当多的级数而工作量可以容忍。

不过,如上所说,用Excel手搓傅里叶级数这一场的大幕落下,那些都应该在另一些故事中再继续。

用Excel手搓傅里叶级数(1)

1. 方程 vs. 数据,解析式 vs. 数值计算

遇到过不止一位同学讨论的时候提到:如果要对这些数据处理—比如求导—是不是需要先求出这些数据的公式来,用拟合?

不。

函数,是从一组量到另一组量的映射。这并不意味着映射需要由公式来表达。典型的,在数字电路中,我们只需要直值表就可以完成映射,逻辑表达式并非必须。同样,只要有了数据,有了横坐标和纵坐标的对应,并不一定需要方程就能表达一种量和另一种量的映射或约束关系。如果不求解析解的话,数值计算并不需要解析式。

比如下面这组数据。

我们并不需要总结它是锯齿波的变形,就可以做针对它的数值计算。事实上,它也并不是锯齿波的变形,而是我随手瞎写的。随便再改一下,就可以换成另一个波形,两种波形之间没什么共性。

一直琢磨如何向同学们解释这个问题能更直观一些,看到书里的实例感觉很适合。还是这本书《程序员数学》 https://book.douban.com/subject/35689348/,用 python 讲解的。

书里的例子是用 python 做已知波形/数据的傅里叶级数。我用Excel重现一遍,再略加扩展。

数据就是数据,不需要转为公式,就可以做各种计算。计算的本质,是对数据的加工,公式作为模型只要在头脑里或者纸上就可以了,代码里不见得能看得见。

以上两组数据中的任意一组,就是Excel中的一列,我们称为 波。

2. 验证函数正交

在做这个波形的傅里叶级数以前,我们首先验证一个结论:傅里叶级数中的各个三角函数是正交基。即使不验证个结论,靠公式推导,或者我们就简单相信(数学课上我常有的状态,我信了还不行么)了,后面的工作也并不影响。不过这个工作也可以由Excel完成,不必更吓人的工具,非常简单,所以不妨拿来熟悉一下Excel做傅里叶级数的路数。

傅里叶级数中的各个三角函数是正交基,这个论断中有两点需要展开。

(1) 各个三角函数是哪些三角函数。包括 正弦 和 余弦。更具体地说,包括某个频率(一般写作ω,即omiga,角速度)的正弦和余弦,以及这个频率倍数的正弦和余弦。

比如sin(1 t),cos(1 t),sin(2t),cos(2t), sin(3t),cos(3t)……

或者sin(2πωt),cos(2πωt), sin(4πωt),cos(4πωt), sin(6πωt),cos(6πωt) ……

这些三角函数的参数怎么确定,我们后面再细说。

(2)什么是正交。正交是指两个基相乘的结果是0,具体什么意思我们不展开。

例如sin(t)和cos(t)相乘的结果如果是0,那么我们说sin(t)和cos(t)是正交的。

有的同学会说,sin(t)和cos(t)相乘,这不还是公式么,并不是仅使用数值判定啊?

任何两个函数,如果它们相乘的结果是0,我们说这两个函数是正交的。两个函数,如果没有公式,如何相乘呢。

(粗糙的)原理是 通过两个函数的内积,像下图这样。

这还是公式,因为里面有 f(x)g(x)这样的表达式。在离散的情况下,它可以等价于下面的(黎曼和)形式。

其中 f(xi) 不是函数表达式,而是执行以下步骤:
对于f这个函数,在一个周期范围内;
查找第i个x;
查表第i个x所对应的y;

这个y就是 f(xi)。

在上一节的表格中,我们增补x的序号,作为最左边的一列。在下图中,列x中的10是i的取值(x的值不重要,或者等于i),波这列的11是f(xi)即f(x11)的值。

类似地,g(xi)也是作数据表示函数。

这里的a和b是我们用于计算的数据的下标的上界和下界,假设为一个周期。N,是把a到b等分为N份。

所以这个等式的意思是

函数f的每一行 * 函数g的每一行 * 1/N;

把上面这句的所有结果相加。

我们 sin(t)*cos(t) 为例,操作步骤如下。

(1)角度

建立一列,标题为角度。A2即第一个单元格,手写1。A3用公式 =A2+1。复制这个公式,至第361行,这样得到角度1~360。

隐藏其中大多数行,为了以后操作方便,不然每次增加或修改数据需要连续翻页几次。

得到以下效果。增加列或修改数据的时候,跨越“隐藏”的7~360行粘贴公式,数据更新也会作用于隐藏的部分。

(2)弧度

新建一列,名为弧度。B2值为 =A2/360*2*PI()。复制这个单元格到整列,如下图所示。我们可以看到,最大弧度6.28,大约 2π.

(3)sin(t)

新建一列,名为sin。C2值为=SIN(B2),复制至整列。

取消隐藏的话,可以画出C列数据,或者画A-C的XY散点图。旁证我们的数据是正确的。

不取消隐藏的话,按下图操作,就可以 在隐藏部分数据的情况下绘出完整的图表了。

(4)cos(t)

用类似sin的方法得到cos列。

(5)内积 <sin(t), cos(t)>

函数正交与否的判定,等价于内积。内积为0的两个函数,相互垂直。

求内积,应用黎曼和公式。

求和即内积即正交与否,结果为3.81699E-17,即0.00000000000000003817,
非常接近于0。旁证了 sin(t) 和 cos(t)正交。

我们虽然用到了黎曼和公式,但是在数值计算的过程中并没有用 解析表示的函数,而是把数据本身作为自变量和函数值,把映射视为函数。

(6)sin(t)和sin(2t),sin(t)和cos(2t),cos(t)和cos(2t)……的内积

所有不同的函数,无论正弦与余弦之不同,还是角频率不同,我们都视为不同的函数。这些不同的函数两两相乘,结果都应为0。

以上组合相当之多,我们挑几个验证。

我们先创建 sin(2t)和cos(2t),像下面这样。只有每列一个单元格是手写的,其余全来自复制。事实上,连B2我也不是手写的,而是在写Excel公式的时候用鼠标点击的。

按sin(t)*cos(t)的方法,得到黎曼和——sin(t)*sin(2t),如下图所示。

结果为-4.22588E-16,非常接近0。

是不是全接近0啊,并不。

(7)sin(t)和sin(t)的内积,以及内积为1

我们选相同的函数,做内积。

结果不是0,是……像是π.

这个结果对不对呢,我们可以用其他数学工具交叉验证一下。

Wolfram|Alpha 说:

上图中的积分范围是 -π,+ π,Excel中的积分范围是0,2π即0,360度。都是sin(x) 的一个周期,所以是等价的。

既然Wolfram|Apha有图,我们也可以在Excel中画一个,再交叉检验。如下图所示,是相同的。

用 Geogebra交叉检验一下,如下图所示,结果也是相同的。

如果你也读《程序员数学》,会发现书中的同一函数s(x) 和s(x)内积的积分结果是1,解释理由是 基底的长度为1。这个结果与我们的不同。为什么呢?

因为s(x)并非sin(x),而是sin(2πx),周期2π,ω为1。我们在 geogebra中从-1到1积分,所得结果与《程序员数学》书中函数sin(2πx)的内积相同。

在Excel中积分-1,1的一半附近,即 0,1 ,如下图所示。

所得结果为0.5。

0,1为-1,1的一半,因此可以推断得到 -1,1积分的结果应为 1。与《程序员数学》书中一致。

(8)小结

以上,我们使用到了 函数正交、内积(事实上还有相关性)、定积分、黎曼和 这些概念,我们使用了一些公式。

但是!在求内积(其他都是原理,对计算过程没有影响)的过程中,我们并不需要任何公式。包括sin和cos这些三角函数,在计算它们的内积时,我们只需要数据。虽然三角函数的数据由函数公式生成,但是在内积计算时,我们无视函数公式是什么,而只需要数据就可以了。即使那些求内积的函数不是三角函数,甚至没有解析式,对计算过程也没有影响——回归到函数的定义,数(的集合)到数(的集合)的映射。

用内积佐证傅里叶的基底,那些三角函数,它们之间是正交的。它们正交这一点,并不是对某个函数/信号傅里叶分析的必要步骤,因为早就已经由前人证明过了。用解析法证明,一般会被视为更优雅吧。讨论内积的原因是,这种做法正是后面用Excel手搓傅里叶级数的手法。所以,此处也算作预备。

2.5 李萨如图形

所谓 既然气氛渲染到这种程度,数据都有了,不画个莉萨如/李萨如图形,说不过去啊。

李萨如图形,是测量两个信号周期比例的方法。不同周期、不同相位的周期函数,一个画横坐标,一个画纵坐标,可以得到非常漂亮且容易识别的图形。在双踪示波器上接两路信号,可以通过画李萨如图形求这两路信号的周期比例。如果其中一路信号是我们生成的,因此周期已知(多么熟悉的路线),另一路信号的周期可以通过李萨如图形求出。

如下图所示,用刚刚Excel中的数据画出的李萨如图形。用XY散点图。

以下是随手做的其他几个例子,好看吧。

(待续)

 

好工具 | Export Tabs URLs 和 Open Multiple URLs 换机器打开多个页面

据说在苹果系列的手机、平板、计算机之间,你可以正使用其中任何一台设备,此时切换到另一台设备,可以方便地自动打开刚才正看的网页。Firefox账号据说也有类似功能,可以在方便PC机和手机之间切换。

跨设备种类的切换,我极少有这一类需求,但是在PC之间切换常有。在一台计算机上看页面,因为链路速度不行,可能要切到远程的服务器。这种时候,通常我已经打开了一堆页面,希望在远程的服务器上把这些页面全都打开。

在一台机器上保存多个URL地址,在另一台机器上打开。手动操作的话,可以用记事本作为中介。

一个个页面的TAB遍历:
  每一个都 alt-d 到地址栏;
  ctrl-c复制;
  ctrl-v粘到记事本;
  下一个TAB。
把记事本中的文本传到另一台计算机
想办法用微信或邮件或远程桌面复制粘贴之类
换机器
对记事本中的每一行URL:
  复制;
  在浏览器中 ctrl-t 开新tab;
  键盘焦点此时正在地址栏,操作 粘贴,回车;
  记事本中的下一行URL。

不仅繁琐,我经常担心漏一两个。而且漏掉的都是重要的,就像迷途的羔羊都格外金贵。

我用两个firefox 插件合完成上述操作,
Export Tabs URLs 和
Open Multiple URLs。

其中一个插件叫做 Export Tabs URLs,地址在 https://github.com/alct/export-tabs-urls。这个工具用于导出url。

比如我正在看以下三个页面。

此时我准备换机器了,先导出URL。

得到所有正打开Tab的URL,我一般点击 Copy to clipboard。

然后我换机器/远程桌面。

在新机器上运行另一个插件,Open Multiple URLs。下载地址在https://github.com/htrinter/Open-Multiple-URLs

粘贴剪贴板里的文本,点击 Open URLs按钮。

在这个案例中,浏览器会尝试打开6个URL,如果不删除每个URL上一行文字的话。我可以容忍,至少不会丢什么。如果洁癖发作追求完美,那就删除URL以外的文字吧。

如果感觉容忍和手动删除都不够优雅的话,在Export Tabs URLs导出时,勾选掉 "include titles"复制框;或者在Open Multiple URLs按Extract URLs from text按钮。

改变向量的基底——读书笔记用geogebra重现

这是系列帖子的下半部分,此前还有一篇。这两篇共同的主题是 改变向量的基——使用 geogebra 演示。

帖子的缘起是我最近读了一本书,书名《程序员数学》,作者 Paul Orland,https://book.douban.com/subject/35689348/,下面图示中的这本。微信读书APP可以免费阅读,排版尚可。

书里涉及到线性代数、高等数学、数值计算、神经网络等的初步,都用python代码实例介绍的,直观,能帮助理解理论知识,适合作为计算机导论的补充素材。自己参考做实验也挺好玩的,比如线性代数中关于直线相关和向量换基底的这部分,我用 geogebra 重新实现了一遍。

3. 改变向量的基底

已知两个条件。其中一个条件是,有个向量,比如从原点到坐标(4,2)的点;另一个条件是,如果换一个基底,这个向量在新的坐标系下会是从原点到哪个点呢?或者说,这个点(4,2)在新的坐标系下的坐标是什么。

书中给的例子是下面这个。

条件一,如果向量在当前坐标系下为 (4,2)。

条件二,新的坐标系是这样的,由两个向量张起,其中第一个向量u1在旧坐标系下为从原点到(1,1)的向量,另一个向量u2为从原点到(-1,-1)的向量。

在u1,u2构成的这个新坐标系下,旧坐标系下的(4,2)的坐标是什么。

3.1 书里的写法,矩阵与基底的关系

书里的写法是这样的,左边的矩阵第1列是u1,第2列是u2。其中的u1和u2分别是新坐系的两个基底。等式的左边是这个矩阵乘以{{c},{d}}这个向量(或者矩阵)。等式的右边是旧坐标系下的向量{{4},{2}}。

可以通过解方程得到c和d的值。在CAS view中操作。

解方程,指定c和d是变量。

得到c=3,d=01。

所以,旧坐标系中的(4,2)在新坐标系中的坐标为(3,-1)。

在图上验证一下。我们指定第一个向量u1的3倍,以及第二个向量u2的-1倍。

看看新坐标(3,-1)与新坐标的两个基底间的关系。

看起来对的,v在新的红色坐标系下,坐标分别对应u11和u22在u1和u2上的投影。

根据《程序员数学》中的例子,总结求 新坐标系下的坐标值的方法,就是解下面的方程,求出c和d的值。

不过这个有问题,看起来 改变基底 就像 线性变换。与上一篇中的 直线相交、解方程 的方法确实非常相似,事实上我刚刚就用了 geogebra 中的 solve 这条指令。不过结果等价,并不意味着原理相同。有不少帖子都指出,改变基底是 换个观察角度,而 线性变换 是在当前空间中操作东西。在《程序员数学》中,对这一区别似乎不太关心。

如果用geogebra画图就会发现,似乎看不出来解这个方程与基底变换之间有什么几何意义上的联系。

如果并非解方程、直线相关的话,那么原理是什么呢?

3.2 支线 线性无关-垂直-正交标准基

在讨论原理之前,先简短地补充一条小的支线。书中给出的例子中,u1和u2两个新基底是相互垂直的,点积为0。

在几何意义上也可以看出二者垂直,根据坐标可以确认。

不仅垂直,这两个基底的长度也相同。根据勾股定理我们能求出,长度/模 在旧坐标系中,都是 ,我们可以把这个长度定义为1。

这可能会误导我们以为所有的基底都必须相互垂直、长度为1。这是对 标准正交基 的要求,高于对基底的要求。基底可以不相互垂直,长度也不必为1。只要不能由基中一个基底线性推导出另一个基底,就行了。

也许我读书不细,作者可能提到了,我跳读没注意。聊此备忘,免生误解。

3.3 矩阵的逆,与改变向量的基底的关系

回到正题,书里这个求解新坐标系下的坐标的方法是什么意思呢,什么原理?

之所以看起来有点奇怪,是因为这个写法不完整。有点像数学书里经常遇到的“显然”,跳了几步一定正确的过程,读者容易跟不上思路。

是个向量,它不够完整。我们补充一点东西。

对角线上全是1的对角阵,这个单位阵,是旧坐标系的基底。因为过于熟悉,我们几乎注意不到它的存在。我们看一下它的含义。

所以, 完整的写法是

这种写法我们见过,就在下面这个等式的左边。

所以,等式的完整写法是下面这样。

C:\Users\young\AppData\Local\Temp\WeChat Files\92467ebb0a4aa3a795fc63bad2dda73.jpg

等式左右两侧都是——基底构成的矩阵 左乘 向量,左乘的结果是向量。

求解c和d,即在新坐标系下的向量的过程,相当于等式左右两边分别左乘 新基底构成的矩阵的逆。得到下面的图示。

等式左侧 {{1,-1},{1,1}}^-1 * {{1,-1},{1,1}} * {{c},{d}} => {{c},{d}}

其中,左侧的两个矩阵为 ,结果为单位阵。

等式右侧 {{1,-1},{1,1}}^-1 * {{1,0},{0,1}} * {{4},{2}},即

结果为

手动/分步计算等式右侧的话,在geogebra中并无必要,为展示计算过程的原理,我们展开一下。

先是

结果为

然后 结果为

与此前解方程的结果相同。必然相同,回顾上一篇中 两直线相交、解方程、矩阵解法,是方法上是等价的。

3.4 换个例子,验证

原坐标系中的点 (5.66,1.46),这是随便点出来的。

新坐标系,第1个基底 (3,4)。为了模长为5而选,原本以为会方便计算,不此必要。第2个基底,是第1个基底顺时钟旋转了90度,得到(4,-3)。

保证正交、长度为1,构成标准正交基。

根据上文中的方法,

求得新坐标系下的坐标为 (0.91,0.73)。

方法一,解方程

或方法二,左乘新坐标基底构成的矩阵的逆。

验证一下,向量的第1个分量和向量的第2个分量,分别除以基向量,4.56/5和3.65/5,结果正是 (0.91,0.73)。

看上图中,在旧坐标系中的(0.91,0.73)的位置相对于旧基底,可以看出与新坐标系下向量相对于新坐标系基底的关系,这两个关系是相同的。

直线相交,二元方程,矩阵——读书笔记用geogebra重现

这是系列帖子的上,后面还有一篇。这两篇共同的主题是 改变向量的基——使用 geogebra 演示。

1. 荐书

最近读了一本书,感觉非常不错。书名《程序员数学》,作者 Paul Orland,https://book.douban.com/subject/35689348/,下面图示中的这本书。微信读书APP可以免费阅读,排版尚可。

书里涉及到线性代数、高等数学、数值计算、神经网络等的初步,都用python代码实例介绍的,直观,能帮助理解理论知识,适合作为计算机导论的补充素材。自己参考做实验也挺好玩的,比如线性代数中关于直线相关和向量换基底的这部分,我用 geogebra 重新实现了一遍。

2.直线相交

在二维平面上,有两条直线,分别已知方程,求交点的坐标。

问题简单朴素,正可以用来熟悉一下如何在geogebra之中把 方程、几何意义、矩阵 对应起来。

下图中的两条直线、两个方程、矩阵,就是《程序员数学》中的实例。我们也用它讨论。

2.1 几何意义,与方程的关系

其中一条直线的方程如下。

输出方程的同时,在geogebra(的standard view)中就显示出了对应的直线。甚至在输入的过程中也对中间结果给出了图形,不过与论题无关,所以省略。

根据上图,我们能看出,斜率刚好是1;在直线上任意一点,x和y总是相等的。

另一条曲线的方程如下。为了与第一条曲线相区别,我手动改成了红色。

两条直线都显示出来了。可以把x和y分别赋值为0,求出对应的y和x,验证图中的红色直线是正确的。

手动标出交点,如下图所示。

即 指行执行,如下图,求eq1和eq2这两个 方程/直线 的交点。

在平面直交坐标系上,可以看到这个点。

以上,是两条直线相交的几何意见,以及与方程的关系。

解两个联立的二元方程,与几何意见对应,即求两条直线相交的交点。在geogebra中的方法,其中一种就是如上所述,画出两条直线,把直线的交点标出来。除此以外,以下方法也有效。

2.2 解方程

用指令Solve,参数是两个方程外面括上花括号组成的 list。

由上图得到精确解,分数表示。鼠标单击 约等号,得到下图,数值解,用小数表示,与此前的两直线交点所得结果相同。如下图所示。

2.3 矩阵形式

《程序员数学》书中给出的是矩阵形式,类似下图所示。

上图中的最后一行,geogebra给出了矩阵对应的方程形式。

方程左半边,即 x-y 、x+2y 与
矩阵形式的左半边,即乘法部分m1m2 的对应关系如下。

2.4 用矩阵解方程(1)

根据刚刚m1,m2,m3的定义,在等式左右两端 分别 左乘 m1的逆。

或者含义相同,geogebra中特有的写法。

然后,
等式左边,m1的逆与m1得到单位阵,向量{{x},{y}}不变;
等式右边,m1的逆与向量{{0},{8}}相乘得到向量 {{8/3},{8/3}}

C:\Users\young\AppData\Local\Temp\WeChat Files\84c0415a4242da9029723dc00cdfa63.jpg

严格地说,得到的并不是x和y的根,而是向量。

这里还有一些扣儿,与主题关系不大,我也不甚了了。姑且跳过,左乘一个矩阵的逆,这个方法在下一次的讨论中要用到,这里作为序曲。

2.5 用矩阵解方程(2)

标准的解法如下。

太阳的方位角变化是否匀速 续 使用excel描点或geogebra画函数曲线

在前文中,为了回答 太阳的方位角变化是否匀速,特别是 在日出和日中时相同时间内的方位角变化是否相同,我们根据天文观测数据,又通过立体几何(?)从原理的角度分析,得出结论 太阳的方位角变化不是匀速的。不是匀速的,这个结论可以更精细一些,方位角(以及高度角)的变化符合什么规律呢?

太阳的方位角变化,涉及天文学里的球面坐标系转换等知识。假设,我们已经理解了这些知识,因此得到了一些公式。这些公式在网上不少,一般地都是对的,并且彼此可以验证。所以,我随便找了一下。

1. 高度角,使用excel描述

之所以需要高度角的原因,一方面,既然方位角变化不是匀速的,对于高度角的变化,我们也很好奇;另一方面,方位角的公式里有高度角,先求出高度角再求方位角更容易一些。

参见 https://zhuanlan.zhihu.com/p/641045406

高位角的公式如下

sin hs =sinφ·sinδ+cosφcosδ·cosΩ

其中

(1)hs 是高度角,待求的值。

(2)φ 为地理纬度,我们保持与前文一致,北纬42度。

(3)δ-赤纬,可以通过公式求得

https://pic4.zhimg.com/v2-554a19438d84e27266e317fcd7932bc3_r.jpg

在这里,我偷懒了,按与前文一致的时间 2016年1月1日,

在这里查表 http://www.jisuanqiol.com/baike/jk/3575.html

得到-22.99度。

(4)Ω-时角,deg (时刻-12)小时*15度/小时。时刻是唯一的变量。

在excel中,时角的公式为

=(E17-12)*15

其中E17是时刻的单元格。

明确了以上几个量以后,我们就可以根据时刻这个唯一变量,求得 指定日期2016年1月1日,北纬42度 太阳的高度角变化。不需要经度的原因,是因为我们使用当地时间。

在excel中,高度角的公式为

=ASIN( SIN(42/180*3.14)*SIN(-22.9/180*3.14)+COS(42/180*3.14)*COS(-22.9/180*3.14)*COS(F17/180*3.14))/3.14*180

其中F17是时角的单元格。

从7:30日出时起,至16:30日落时止,每隔1小时计算一次,我们得到以下表格。

其中 时刻以小时为单位,例如7.5代表7:30分;

时角,是计算的中间过程;

高度角,为所求目标。

画图如下。

从图中我们可以看出,高度角从日出时0度,逐渐上升,在正午时25度左右。下午至日落,高度角逐渐降低。

细致观察我们也可以看出,高度角的变化不是匀速的,似乎日出时快,至日中时慢,与前文中的结论一致。

对高度角的变化,我们作进一步的定量分析,求每两次计算值之间(因为时间间隔一致,因此差分即斜率)。为了符合一般感觉,我们把对差值再取绝对值。这样,我们得到下述表格。

其中,diff为两次高度角之差,diff-abs为取绝对值的结果。绘图如下。

在上图中我们可以看出,高度角的变化/差分/斜率/导数,不仅早/晚和中午不同,而且还有更细致的变化规律。那可以由二次导求出。事实上,仅通过公式,我们也可以知道,其中有三角函数,变化一定不是线性的。

2. 方位角,使用excel描点

参见 https://zhuanlan.zhihu.com/p/526310019?utm_id=0

里面有个公式,我截图抄来如下。

可以得到以下方位角的公式。

cos 方位角 = (sin 赤纬 - sin 高度角 * sin 纬度 )/(cos 高度角 * cos 纬度)

有两点需要简单解读。

(1) 右式=cos 方位角,所以可以用对右侧式子取 acos,从而得到方位角;

(2) 要保持所角的都是角度制或者弧度制,并且符合所用工具excel的要求。

其中

赤纬查表 -22.99
高度角 已求
纬度 42

这样,唯一的变量是时刻。与上文中高度角一样,我们从日出到日落,每隔1小时求一次方位角。

2016年1月1日,北纬42度。

在excel中公式为

=ACOS((SIN(-22.99/180*3.14)-SIN(42/180*3.14)*SIN(B14/180*3.14))/(COS(42/180*3.14)*COS(B14/180*3.14)))/3.14*180

其中B14是时刻的单元格。

过12点以后,上述方位角公式失效,角度开始回转。所以我稍作改动

=180-ACOS((SIN(-22.99/180*3.14)-SIN(42/180*3.14)*SIN(B19/180*3.14))/(COS(42/180*3.14)*COS(B19/180*3.14)))/3.14*180+180

其中B19是时刻的单元格。

根据上述表格绘图,结果如下图所示。

我们可以注意到,早晨和中午的方位角变化,有5度左右的差异。日出和日落时方位角变化慢,接近中午,方位角变化快。正午前后,方位角变化慢了?

上述使用 excel,比前文中天文数据或立体几何中取几个点,看起来更具有一般性。并且,对于扩充到更多的数据,我们仍有潜力。

我们还可以做得更好,使用 geogebra画函数曲线

3. 高度角,使用 geogebra画函数曲线

根据公式,我们得到 f(x),如下。

其中,lat是纬度,我们暂定42度; dec是赤纬,我们暂定-22.99度。

绘出函数图像如下。

求导,得到蓝色曲线如下。

比excel描点的方法,我们能得到更多更密集的数据。

不仅如此。我们可以容易地修改纬度和赤纬。

上图是 纬度为0、赤纬为0 的太阳高度角变化。早6点日出,晚6点日落。12小时白昼。作为对比,北纬42度的元旦,白昼只有9个小时。正午太阳高高角90度(90.01多出的部分,我猜测是计算误差)。

它的高度角变化,是均匀的。

很容易切换到北极圈以内,白夜,太阳永远不落到地平线以下。

4. 方位角,用geogebra画函数曲线

锁定纬度、赤纬,高度角由公式求出作为中间结果。

方位角公式如下。

叠加了高度角帮助判断日出和日落,绘出函数图像如下。

变化率,即求导的结果呢?下图中,绿色的曲线是对方位角曲线求导。

看来,正午12点左右,我修改过的公式有毛病,出现了间断点。其余的形状看起来都与excel描述的结果一致。哪位大侠知识正确的方位角公式,还请不吝赐教。

我们定位到北极圈接近北极点,赤纬接近0的那一天。

得到方位角持续不变。

这是超出了公式的有效范围,还是……方位角是南?如果方位角是南,那应该是180度吧。

后面的Geogebra函数曲线,我解释不了,超出我所了解的范围了。不过使用geogebra画曲线;改参数值,观察曲线立即变化,以及曲线导数的变化,很有意思。

5. 结论

在多数时间和地区,太阳的高度角和方位角的变化,不是匀速的。变化的速度持续改变,需要用公式或图像才能定量描述。

疑似,有些地区,有些时间,高度角或方位角的变化是匀速的。