如何优雅地测量一只猫的体积,而不使其感到惊恐或受到伤害?
Posted 程序员大咖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何优雅地测量一只猫的体积,而不使其感到惊恐或受到伤害?相关的知识,希望对你有一定的参考价值。
👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇
本文讲述了14种方法来优雅地测量一只猫的体积,而不使其感到惊恐或受到伤害。其中的方法基于物理学,测量学,大数据等,这些方法,优雅而不失风趣。摘选将力争简洁明了。
>>>>
方法一(by 组诗耶)
将无辜的喵星人放入如图所示的密闭容器中,并迅速(同时又缓缓地)将活塞推动少许。
如果假设:
1. 喵星人可视为刚体/流体,即在微弱的气压变化下,喵星人体积不会被压缩
解毕。
方法二(by 有勇有萌兔)
Monte Carlo 测猫法:
把猫装进已知体积为V_box的盒子,在盒子内均匀取N个随机点,其中M个在猫体内,猫体积近似为V_box*M/N。推理及讨论见supplemental materials.
要实现这一测猫法,需要一种瞬时确定某点是猫还是非猫的方法,否则在猫运动的情况下,会测得猫扫过的体积而不是猫体积。
我决定用下图所示的方法。。。
盒子壁上装尽量多的激光灯,盒子壁用感光材料。若要确定某点是猫还是非猫,则让所有激光灯射向目标点。若目标点是猫,则激光会被猫挡住因此盒子壁上任何一点都不会检测到激光。因此我们用以下原则判断目标点是猫非猫:
若有盒子壁上任何一点检测到激光,说明目标点非猫。
否则认为该点是猫。
测量可以在很短的时间内完成,足以快到忽略猫的运动。
当然这种方法是有缺陷的,猫身上一些凹陷部位可能会成为激光无法穿过的死角,因此被算入猫体积。
一个充分不必要的解决方法是让猫变成凸猫(convex cat), 即任取两点属于猫,两点之间的线段上的点都属于猫,满足这一条件的猫叫做凸猫,如下图所示。
下图是一个现实生活中凸猫的例子。。(图片来自网络)
对于凸猫,该方法测得的猫体积即为真猫体积,证明见supplemental materials中的夹逼测猫法。
但是这种方法是不猫道的,因为猫咪宣言中有这样的话:
We hold these truths to be self-evident, that all cats are created equal (大雾), and they are endowed by their Creator with certain unalienable rights, that among these are the rights to stand up, lie down, turn around, groom themselves and stretch their limbs ...
要测量猫体积,首先要定义猫体积。
猫的体积定义并非显而易见的,主要有两个困难:
猫的表面是凹凸不平的,那些凹陷和缝隙怎么算?客观标准是什么呢?
喵是测不准的。理论上来讲喵的电子云可以想你时你在天边,想你时你在眼前,哪里算边界?
嗯。。化学家出场了。。。
化学家测猫大法:
把一个直径一定的毛线球用一定力量按在喵体表滚一遍,把毛线球与喵接触的内表面轨迹包括的空间的体积视为猫的体积,并称之为Van de Waals cat volume 。
如下图。
这一体积定义包含两个要素。毛线球的直径和按在猫身上的力量,前者决定了凹陷和缝隙算与不算的体积和形状标准——毛线球放得进就算,否则不算;后者决定了猫边界的标准——和毛线球之间的作用力达到某一值为准,啥啥电子云都不好使,就看力的大小。通过改变毛线球和力量的大小,可以控制猫体积的精细程度。究竟多精细不重要,重要的是可以定义一个体积的客观标准。
仿照这一定义,我将我测得的猫体积定义为 Van de Bars cat volume。。。如下图。。。
准确来说,是一个直径相当于激光束粗度,无限长的bar在猫表面滚过定义的猫体积。。。你看。。。我测的体积也是有一个很有道理的定义的嘛。。。。
我认为实际测量中Van de Bars 猫体积和我们一般认为的猫体积差异并不大。
比如看下图
E为克莱因猫,虚线部分在猫体内。。
对于碗状猫(bowl cat),Van de Bars 猫体积确实会把猫肚子下面那块空间误算做猫体积的一部分。但是对弓状猫(bow cat)、椅状猫(chair cat)的测量都是准确的,因为光线可以从图上箭头的角度穿过。甚至小昭猫(shaw zhao cat)这个我本来觉得挺奇葩的形状下其实并没有任何问题。这样一来,Van de Bars 猫体积在多数情况下和我们一般认为的猫体积的区别也就仅限于耳廓内的空间、个别身体缝隙之类的光穿不过的死角。。。我觉得还是能接受的。。。
为了尽量避免碗状猫对测量的影响,我们要大力鼓励猫咪充分 stretch their limbs. 这也提示我们,爱护猫咪对我们蓝星人也是有益的。。。所以爱护猫咪,人人有责,no cats should be convex!!!
综上,我设计了一种测量Van de Bars 猫体积的Monte Carlo测猫法。我觉得这是目前回答里最猫道最优雅的。。。因为它保障了猫咪伸展身体、弄干身体、不受恐吓、自由站起、躺下、翻身的权利。。。而且对猫体积有严谨而实用的定义。。。
Supplemental materials:
Monte carlo 测猫法的推理:
把猫装进体积为V的盒子,在盒子内 uniform randomly 取N个 independent and identically distributed (i.i.d.) 的点组成样本,记为 SAMPLE = {(xi, yi, zi) | i in range(0, N)}。
定义如下 function:
I(x, y, z) = 1 if (x, y, z) in CAT else 0
(即确定一个点是猫还是非猫)
假设猫体积(V_cat)不变,且猫的运动与取点不相关,则I(x, y, z)具有如下分布:
I(x, y, z) = 0 with a probability of 1-V_cat/V_box
I(x, y, z) = 1 with a probability of V_cat/V_box
与猫运动与否不相关。
根据这一分布I(x, y, z)的期望值是V_cat/V_box.
{I(xi, yi, zi) | (xi, yi, zi) in SAMPLE} 是一个服从上述分布的 i.i.d. 的sample。
根据大数定理(law of large numbers), sample mean almost surely converges to expected value. 所以可以用 sample mean 估计期望值,即:
V_cat/V_box ~= sum(I(xi, yi, zi))/N
记M为在猫体内的样本点数量,则
V_cat/V_box ~= sum(I(xi, yi, zi))/N = M/N
所以V_cat ~= V_box * M/N
关于猫毛的讨论
上述方法等价于把猫边界定义为猫体表透光率显著不同于空气以至于足以使得sensor检测到差异的位置。可以想象这应该包括了猫毛,而且是不受压迫不变形的猫毛。
Van de Bars 猫体积和其他猫体积的对比 (不适用于克莱因猫)
VS 真 猫体积
这里真猫体积指刨除一切空隙的猫体积。显然,Van de Bars 猫体积 >= 真猫体积。所以Van de Bars 猫体积是真猫体积的一个upper bound. 可惜的是它们之间的差是没有任何保证的,比如口袋猫。
VS Van de 毛线球 猫体积
我觉得Van de Bars 猫体积应该是与bar同样直径的毛线球定义出的Van de 毛线球猫体积的upper bound,但是我没仔细证。。。因为比如bowl cat这样的存在,它们的差同样是没upper limit的。。。
VS Convex Hull (附夹逼测猫法)
一个set的convex hull 是包含这个set且convex的最小的set。如下图。
易知Convex hull 猫体积 >= Van de Bars 猫体积 >= Van de 毛线球猫体积 >= 真猫体积。对于convex猫,因为猫本身就是convex的,所以猫和猫的convex hull是同一集合,所以Convex hull猫体积 = 真猫体积,所以convex cat 的真体积 = Van de 毛线球体积 = Van de Bars体积 = Convex hull 体积。。。。。。夹逼测猫法。。。。convex 猫真好测。。。各种体积都一样。。。all cats should be convex。。。
关于克莱因猫
准确讲克莱因猫应该是克莱因猫皮(Klein Cat Skin),因为这是一个曲面而不是实体,而且这个曲面不能把空间分为内、外互不连通的两部分,所以也无法把克莱因猫体积定义为克莱因猫皮围成的空间的体积。仔细看Fig. 6 E 的话,克莱因猫“体内”的空间可以通过尾巴-食道-口和外界相通。所以严格讲,克莱因猫无体积。
但是这并不妨碍我们继续强测克莱因猫的 Van de 毛线球体积和 Van de Bars 体积,只是不同于之前可以把这作为真猫体积的近似,现在我们必须将其作为一种独立的体积定义使用。
在克莱因猫上 Van de Bars 猫体积比 Van de 毛线球猫体积鲁棒。因为当毛线球小到克莱因猫可以吞下去的时候,毛线球会沿着口-食道-尾巴通路把喵“体内”滚个遍,然后 Van de 毛线球体积为零。。。而 Van de Bars 体积因为使用的是无限长的bar, 所以即使bar直径再小也无法access喵“体内”的空间。这允许我们用较细的bar来提高测量准确度而不必担心体积忽然降为0.
其他'家'的测猫方法:
物理学家测猫法:取一只半径为r的真空中的球形猫,体积等于4/3*πr^3
数学家测猫法:把猫装进已知体积为V的盒子,在盒子内均匀取N个随机点,其中M个在猫体内,猫体积近似为VM/N。
生物学家测猫法:把control猫装盒子,塞了10次都塞进去了,把实验猫装同一个盒子,塞了10次只进去两次,所以,猫多大我不知道,反正显著大于control猫。
方法三(by Hao中336)
因为猫是液体,所以把它倒进量筒里,眼睛平视凹页面最低处,得到的读数就是体积。
补充:有不知道那么为什么是液体的,请看~
看完后大家不要把自己家猫往瓶子里塞哦~
补充:
盆景猫只是谣言。大家可以看百科的解释。
我不赞成把猫泡在水里测体积。即使你无视了它们的恐惧,当你把它从水里捞出来的时候…
感受到他们的不爽了吗?
所以啦,只要趁猫猫优雅的睡觉的时候~
赶紧去亲两口啊!
千载难逢的机会啊!
测什么体积!>__
方法四(by Corsola)
正经方法来了!正经方法来了!正经方法来了!
排液测体积当然是最传统的方法,传统到有好几千年的历史;
但是你们这些忠心护主的仆人们不让用这种方法,那怎么办呢?
排液不成我们可以排气啊!
测量步骤如下:
1.准备一个足够大的密闭容器并用阀门连接一个具有较高压力的气瓶;
2.将猫放进密闭容器里,安抚使之不要剧烈运动;
3.测量此时密闭容器内的压力p0、气瓶内压力ps0;
4.打开阀门,充入一定量的气体,再关闭阀门;
5.等容器和气瓶的温度都恢复到环境温度后,记录此时容器内的压力p1和气瓶内压力ps1。
然后开始处理数据:
设容器容积为V,气瓶容积为Vs,猫的体积为x。根据3和5状态的气体质量守恒,有
可解出
就得到了测量结果。
误差来源分析:
除仪表误差外,可能存在的误差来源还有:
1.如果你折腾时间太长,猫呼吸引起的气体成分改变会使得前后气体质量不一致;
2.如果4-5之间的时间不够长,温度未恢复也会引起质量计算时的偏差。这可以通过额外再测温度来进行适当的补偿;
3.猫本身是个热源,由此导致的气体温度变化和温度分布不均匀引起的测量误差;
4.猫有可能上蹿下跳,引起容器内流场变化,影响压力测量;
5.我懒得编了。。。。。
需要注意的是,此种方法得到的猫的体积和通常我们定义的不一致,是真正的“猫”所占据的空间大小,而不包括实际上是体外空间的呼吸道和消化道容积。
不知道现在回答算不算晚。看了上面几个答案,感觉很不开心。愚蠢的人类不仅在生活中向喵星人臣服,甚至在技术和科技领域也向他们做出了妥协。
可是你为啥要欺负我们狗啊啊啊啊!!(虽然我也给那个狗密度近似的答案点了赞)
我认为,准确测量猫的体积是可以的。同时不对猫造成惊吓和伤害也并非不可能。首先,我们要测量猫的重量,这步并不是很困难,就不细说了。下一步,也是目前公认最困难的一部分,就是测量猫的密度。
大家都知道,物体浸泡在比自己密度高的物体中时会上浮,而在密度较低的物体中会下沉,由此,我思考出了猫密度的计算方法。
这时候细心的小朋友肯定会说:
“哎蓝狗哥,记得不要惊吓或者伤害猫哦!”
没问题。
首先,我们需要一个常见液体密度表:
再而,我们需要诸多呈密度梯度的液体。
然后,我们需要一个比猫略大的桶。
聪明的小朋友们肯定在这时候已经明白我们要做什么了。对了!就是二分法测密度。
步骤如下:
1. 把液体盛入大桶,将猫咪扔进桶里。
2. 观察猫咪的状态,这时候猫咪会呈现两种状态:
若得到A结果,下次就换以密度更低的液体;
若呈现B结果,下次就换以密度更高的液体。
(精准的液体密度可由多种液体相勾兑得到。)
再次实验。
再次实验。
再次实验。
.....
这时候细心的小朋友肯定又会说:
“哎不对啊蓝狗哥,这样还是会伤害到猫啊!”
其实上述方法我们并不需要执行,这种二分法的作用只是:看起来很残忍。
学会了上述方法,你只要把这些步骤讲给猫听,或者像我一样画给猫看....
你的猫会说:“等一下铲屎哒!我招!我的体积是....”
方法六( By 天枢真人)
我们应该定义以下概念:
1,猫:
2,体积:什么体积?落汤猫体积,还是带毛猫体积?
3,惊恐
于是我们按照多数人的感官,把问题描述为:如何在不引起Felis catus的反抗和反击的前提下测量其毛发末端和裸露皮肤及粘膜所限定出的表面所围成的空间体积?
由于优雅要求和毛发边界要求,使得排水和排颗粒方法都不适用,这是由于这些方法都会使得介质压缩Felis Catus的毛发并且使得测量体积小于真实值。很显然压缩测气压法同样不适用。麻醉3d扫描得到的是猫在仰卧条件下的轮廓外形,无法排除猫的身下空隙。CT无法扫描毛发外形,因此也是不可能实现准确测量的。
因此反对所有答案。
方案是:
1,将外形接近待测猫的石蜡猫模型放置在球形玻璃罩当中,并且在玻璃罩的外侧沿球面均匀设置若干照相机,并且将所有照相机的快门设置为同时。获得猫模型的各个角度图像。利用三维重建来获得猫模型的计算体积,用标准方法测量猫模型的体积,据此得到校正系数。
2,把猫模型换成猫,重复以上拍照和三维重建步骤,并且使用校正系数来获得猫的体积。
方法七(By 苍原雪)
我们不妨假设喵是球形的,这样
嗯
————————————好了说正经的————————————
猫的体积是不能浸水量的,因为 你家的喵洗澡之前可能长这样:
哦不,这样:
但是洗完澡就变成了这样:
嗯,如何?
你真的觉得那个泡完水以后长得像老鼠一样的东西是你家喵吗?
正确方法是找个箱子,等喵自己钻进去(应该不会太久),太大就换一个小的,小了同理。直到找到了一个合适的箱子,再去量一下箱子的体积。
方法八(By 马前卒)
让猫自己判断。
猫碰到陌生同类时,一般是根据体积来判断战斗力,也会通过“炸毛”等方式来显示自己体积大。遇到体积大的同类,猫会动员肌肉但一般不主动挑起争斗,体积小的则喜欢先下手为强。所以我们可以做许多只猫的逼真模型,从大到小不等,然后分别在不同颜色、不同场合,喷上不同的气味和猫“偶遇”。当发现哪种大小的模型引发猫咪主动进攻的概率稳定在50%,差不多就可以把这个模型扔进水里测体积了。
哦……要求是不使猫惊恐,那我这个貌似违规。
方法九(By 晓寒)
准备大小不一的盒子,盒子的体积呈等差数列,看猫能最小钻进哪一个,以此得到近似解。考虑到成本最优,可以采取牛顿二分法,同时可以以此调整所得到的体积的精度。
方法十(By 匿名用户)
化学狗觉得以现在的天平的精确程度,完全不需要排水,排空气法一样能测,只不过设备比较贵而已。
其实吧,要测不规则物体的体积,大家第一反应就是排水法嘛,阿基米德同志发明的嘛,把国王的王冠往自己的洗澡水里面泡一下嘛...但是喵爷岂是任由你们随便往水里泡的。
大方向很简单,无非就是把排水法改成排空气法而已,借用现代的精密仪器并不难称量,但以下要说的主要是怎么用简单的仪器来实现。
先给个公式出来,高中化学学过的,理想气体状态方程;
PV=nRT (P是压强、V是体积、n是气体摩尔量、R是常数、T是温度)
接下来给出实验装置示意图(体现我美术功力的时候到了...恩)
如图,我们先解释装置再解释原理。
装置底部一个内部体积已知的大容器,喵爷被放在里面...别问我怎么让喵爷进去。
上面是一个细长细长的管(有刻度),圆形的东西是个重量适当的密封活塞。
别问我多细多长,也别问我什么重量是适当,我只是说原理...恩
以下是原理,当然我们会用到一些假设,但是不至于假设真空,也不需要喵爷是球形...总体来说是可以接受的假设。
第一步如左图,由于内部的气体有压强,所以活塞是受气体压力顶着悬浮在细长的管道内的。
(为了方便,我们先假设活塞和管道内壁没有摩擦,这只是单纯偷懒,因为有摩擦也无所谓,只是计算时候多个参数而已,并无太大影响)
具体参数:
假设底部大容器的内部体积为V0,喵爷的体积为X,活塞重量m,上部细长管内部截面积S,活塞距离底部大容器的距离为L0。根据受理分析活塞m受到的重力=气体对它的压力的时候才会平衡。
接下来是理想气体状态方程的引入PV=nRT嘛,对应的左图中:
压强P×截面积S=活塞重力m×g;即PS=mg→P=mg/S(1)
体系内空气体积V=容器内部体积V0-喵爷体积V+细长管内空气体积(L0×S);即V=V0-X+L0×S (2)
然后n保持未知,R是常数,温度就按照室温好了。
注意,从左图到右图的过程中我们假设环境温度并不变化。
所以,PV=nRT这个等式右边是恒定的状态。即PV=k(k是固定的)
所以综合(1)(2)我们得到(mg/S)×(V0-X+L0×S)=k(方程A),即左边的值是固定的。
其中,m、S、V0、L0都是可以测出的,g是常数,所以等式中还有2个未知数,即X和k。
然后我们第二步改成右图那样,用一个已知的力F压活塞,活塞下移一个距离,从而活塞距离底部容器的距离缩短为L1。计算原理和上面一样我就不详细说了,用数学书上常见的话说:
显然或易证:[(mg+F)/S]×(V0-X+L1×S)=k (方程B)
上式中m、S、V0、L1都是可以测的,F是你自己设定的所以也是已知。
于是就只有两个未知数X和k了。
综合方程A、B,两个方程两个未知数,喵爷的体积X就有了。
X=[(mg+F)(V0+L1×S)-mg(V0+L0×S)]/F
(我的渣数学万一解错了的话我也没办法)
其实上面说那么多只是为了显摆我还会列小学生的二元方程而已...
(其实我觉得我上面的模型建的不好...因为是凭借直觉直接建的,研究研究应该还可以简化)
对模型的一些其他解释:
之所以要设细长管是因为方便读数,因为只要上面的管子够细够长,稍微用一点力活塞就能向下移动相当一段距离方便度数,同时容器内压力也几乎不怎么增大,喵爷不会感到不适;同样地,为了这个目的,只要密封性良好,底部的容器可以做大一点。这样就可以满足【优雅】这个需要了...恩
改变气体压强的方式多了,不一定要像我那样用力F神马的,你改温度也可以,思路都一样。
方法十一(By 名称不重要)
勤学好问的我一直在努力思考自己本专业的知识能不能做到这点。
1、线激光扫描法
在萌萌哒的小猫咪趴在地上睡觉时,默认底下完全贴合,不考虑底下的空隙【因为它那么多肉肉肯定会贴合是吧】用三个线激光从三个方向对猫进行从下到上扫描,保证360无死角,同时每个激光器旁边有一个CCD,三个激光器同时从下往上扫描,根据已知的位置信息,结合三个CCD采集到的图像,可以还原小猫咪的三维形貌,进而得到体积。
2、big data
上一个思路是考虑到我本科学光电的,但我现在做数据挖掘方向了,也得思考一个方法。
将上面所有答案和现在能找到的猫的体积作为已知,将这些猫的特征作为输入参数(比如年龄、体重、大小、品种、每日食量或者还有图片等)都作为输入,采取有监督的deep learning 模型进行训练,训练完后输入自己的猫的相应参数,计算得到的结果应该是统计意义上误差较小的值。
方法十二(By Josef Wann)
方法十三 (By 非藤)
1.由萌妹子抱着猫并不断安抚它
2.将萌妹子和猫一起浸水
3.将萌妹子和猫一起拿出来
4.将萌妹子浸水
。。。大功告成!
方法十四(By 多元守护盾)
气体压强公式:PV=nRT。
P是气体压强,V是气体体积,n是气体物质的量,R是常数,为8.31441±0.00026J/(mol·K),T是气体温度
公式变形得V=nRT/P,也就是说知道气体的物质的量(可由质量求得)和温度以及气压即可求出气体体积。
现在把猫放在密闭容器中,容器放在真空环境下,测量容器整体重量,减去容器本身重量和猫的重量就是气体重量,由此求出容器内气体质量,再测量容器内气体温度和压强,代入公式得到容器内气体体积,再用容器体积减去气体体积就是猫的体积。
-End-
最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!
点击👆卡片,关注后回复【面试题
】即可获取
在看点这里好文分享给更多人↓↓
以上是关于如何优雅地测量一只猫的体积,而不使其感到惊恐或受到伤害?的主要内容,如果未能解决你的问题,请参考以下文章
如何调整 UIButton 的大小以适应文本而不使其比屏幕更宽?
如何在 Xcode 的 Storyboard 中保持高分辨率图像而不使其像素化?