xzcyr xzcyr
关注数: 3 粉丝数: 743 发帖数: 13,770 关注贴吧数: 18
【补档】保尔是不是叛徒——《钢铁》的历史背景和民族认同问题 本帖原为吧友 @故垒萧萧 所发,(就我所知)是中文互联网最早对标题所述问题作深入探讨的文章,堪称本吧镇吧之宝,但遗憾的是,该帖自百度“灭霸式删帖”后就一直没有恢复,作者本人也长期未上线,故现在重发一下。本帖备份极早,原帖下的回复未能收录。(包括作者本人的勘误。)想阅读完整版,只能期待原帖奇迹般恢复或是作者重出江湖了。 ———————— 保尔是不是叛徒——《钢铁》的历史背景和民族认同问题 吧里有人说,保尔是乌克兰民族的叛徒。对这个问题,我想写写自己的观点。我认为保尔不是叛徒。不过在说这个问题前,我想先写一些乌克兰的历史方面的东西。 1、俄罗斯和乌克兰的关系 俄罗斯、乌克兰以及白俄罗斯是三大东斯拉夫民族,其共同的祖先是古罗斯人,乌克兰的基辅城被认为是“罗斯众城之父”。后来蒙古人入侵,包括诺夫哥罗德以及后来的莫斯科等城市被蒙古人统治,而立陶宛、波兰等国(不要小看他们,虽然后来很矬,但想当年这都是很牛叉的大国)则也趁机东进,占领了包括基辅在内的大片地区。以此为契机,俄罗斯、乌克兰和白俄罗斯三大民族开始逐渐形成。后来,俄罗斯驱逐了蒙古人。而乌克兰人在1648年爆发了反对波兰的大起义,在起义中寻求俄罗斯的支持,最终于1654年签订俄乌合并协议。 此后,乌克兰和俄罗斯的关系一直保持,但是乌克兰也自始至终都有人争取乌克兰的独立。比如在彼得大帝时期,乌克兰首领马泽帕就曾乞求来自瑞典的支持;十月革命后,也有乌克兰民族主义者试图独立(彼得留拉就是其中之一);二次大战期间,还有乌克兰人试图在德国的支持下建立独立的乌克兰。1944年2月,苏联大将、坦克战专家瓦图京(瓦杜丁)于遭乌克兰分离主义者袭击重伤,最终于4月不治。1954年俄乌合并300年时,俄罗斯将克里米亚半岛送给了乌克兰作为礼物(不过我觉得如果俄罗斯人当时知道现在是这个样子,杀了他们也不会这么做……)1957年,克格勃特工斯塔申斯基(也是乌克兰人,后叛逃并将行动公之于众)在西德刺杀了乌克兰分离主义者列夫·里贝特。最终在苏联解体的大潮中,乌克兰脱离苏联(也脱离俄罗斯)而独立。不过,两国长期的合并,客观上使得他们的历史很难分别——很多沙俄和苏联的历史人物很难说是俄罗斯的还是乌克兰的。比如,果戈里到底是乌克兰还是俄罗斯作家?果戈里本身是俄罗斯人,但其大量作品都是在乌克兰完成的。所以在目前纪念果戈里的活动中,可以看到,乌克兰和俄罗斯在为一件事情庆祝——这在目前的地缘政治格局下实在罕见。 2、东西乌克兰的差异 如上所述,乌克兰民族自身就是在各方实力的角逐中产生的,因而其自身又有差异。比较大的就是东西乌克兰的差异——东乌克兰亲俄,西乌克兰亲西方。 第一次世界大战前我不清楚,这里不说。一战期间,俄国爆发十月革命,德国趁机向东进攻获得西乌克兰和西白俄罗斯在内的大量土地,苏俄被迫接受并签订了《布列斯特合约》,但德国自己也随之战败。协约国在武装干涉俄国的同时,在俄、德之间重建了波兰,领导人是毕苏斯基(ps:戴高乐曾经被派往波兰协助波军和红军作战,而他在德国战俘营里的朋友、沙俄军官图哈切夫斯基则——按照国军的说法——“投了共”,后来成为苏联元帅)。红军曾向波兰进攻,但最终在华沙城下失败。因此,西乌克兰和西白俄罗斯就成了白色波兰的领土。二战前夕,纳粹德国和苏联签订互不侵犯条约,按照协议,德国进攻波兰的同时,苏联也向西以保护白俄罗斯和乌克兰同胞的名义一起进攻,两国瓜分了波兰。西乌克兰和西白俄罗斯也随之成立了苏维埃政权,并并入了乌克兰和俄罗斯。二战后苏联击败纳粹德国,西乌克兰、西白俄罗斯(以及波罗的海三国、摩尔多瓦等)仍然是苏联领土,而波兰则向西拿走了德国的(如果没记错的话)东普鲁士、西里西亚等地区。这就是现在这一地区版图的由来。苏联解体时,西乌克兰仍然是乌克兰的一部分。 可以看到,至少100多年以来,东、西乌克兰的政治是有巨大的差异的。这对于一个民族在政治等方面的观念来说,足够造成巨大的分歧和差异了。 这大概也就是西乌克兰人亲西方,喜欢强调其历史上和波兰(和俄罗斯、乌克兰不同,波兰人是西斯拉夫人,政治上合西方关系密切,信仰和西欧一样的天主教,书写用拉丁字母——对东斯拉夫人来说,足够西方了)以及德国等西方国家的关系,而东乌克兰人亲俄罗斯,更喜欢强调其与俄罗斯共同历史民族渊源关系的原因吧。 3、保尔不是叛徒——关于《钢铁》中的民族和国家认同问题 (说了这么一堆,终于进入正题了) 老实说我不知道舍佩托夫卡的具体位置,不过我记得这里曾经是苏联和白色波兰的边界,那么这里应该不是西乌克兰,应该算东西乌克兰的一个路口。这里既有彼得留拉匪帮,又有红军,这可以说再正常不过了。而在沙俄崩溃的时刻,保尔面前,既有来自东方的、工人阶级的红军,又有得到西方支持的、地主阶级的白军。作为工人阶级的一员,保尔他们选择了红军,选择了苏维埃,这是再正常不过的。选择红军虽然意味着乌克兰和俄罗斯的合并,放在俄乌文化相近且长期合并的大背景下,这种选择无可非议(而要是在如获得独立芬兰等地,难保不被当成“芬奸”什么什么的)。而白军在西方的支持下,虽然号称争取民族独立,但是很难说会不会在英法列强的大笔一挥下和波兰合并以组成一个更强大的白色国家来反对苏联(这种事情太常见了,比如阿尔巴尼亚的独立——如果我没记错,阿尔巴尼亚建国的最初目的,是为了让塞尔维亚失去出海口。在强权面前,一个弱小国家和民族是否独立完全要服从大国的需要。) 因此,在俄乌长期的合并和共同的历史文化背景下,再加上阶级认同,保尔的选择没什么问题,说保尔等人是出卖乌克兰民族的叛徒,是没什么道理的。 这是当时的事情,现在呢?苏联解体了,乌克兰终于独立了,在乌克兰民族主义的影响下,俄乌冲突不断。反映在历史上,而一切苏联时代被打倒的——无论是意识形态还是民族观念上——都回来了,而苏联时代的英雄则被抛弃了。保尔远去了,青年近卫军远去了,反对俄罗斯的彼得留拉和马泽帕则成了英雄。当历史成为政治的工具的时候,很难说这种有色眼镜下的历史还有多少真实的成分。 而作为旁观者,我们甚至不需要了解这么长的民族恩怨,我们应该记住的是保尔的精神——无论面前有多少艰难险阻,只要一息尚存,就应当为自己所坚持、热爱和信仰的一切战斗下去。 还是用最经典的那一段话结尾吧—— 人最宝贵的是生命。生命对人来说只有一次。人的一生应当这样度过——当回忆往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞愧;在临死的时候,他能够说:“我的整个生命和全部精力,都已献给了世界上最壮丽的事业——为人类的解放而斗争。
关于近期出现在SE的对广义有限差分法(GFDM)的失败(?)尝试 嗯……吧里关心微分方程的人不多,不过这个月新帖也少,姑且发个帖说说近期出现在Stackexchange的这个我觉得还比较有意思的帖子。我们知道,对于不规则区域上的偏微分方程求解,目前有限元法(finite element method, FEM)几乎可以说是一家独大(我甚至见过某些对微分方程求解不甚了解的童鞋竟模模糊糊地觉得“解偏微分方程=用一下有限元”);目前,在Mathematica的NDSolve函数的内置方法里,它也是唯一一种可以在不规则域上求解偏微分方程的方法。但是,可以用于不规则域的偏微分方程数值求解方法其实远不止有限元一种,今天我要讲的就是一种较为小众(?)的无网格偏微分方程求解方法——广义有限差分法(generalized finite difference method, GFDM),也称无网格有限差分法(meshless finite difference method, MFDM)。 我们知道传统的有限差分法(finite difference method, FDM)所用的差分公式是基于单变量泰勒展开的,这使得其通常只适用于规则区域的求解(当然了,基于外差法或是坐标变换将FDM用于不规则域是一个可行的思路,但是非常繁琐,一个例子是SE帖子《Poisson PDE over a irregular region with FDM》(编号:64585)),GFDM的改进,在于使用多元泰勒展开(不是内置的那个,而是“点附近的展开”,可以参看《Multivariable Taylor expansion does not work as expected》(编号:15023))代替单变量泰勒展开,也就是说,对于选定的中心结点,我们选定它附近的n个点,分别作n次多元m阶泰勒展开(m和n不必相同),获得n个方程,再使用最小二乘法求解这n个方程,即可得到该点处的1至m阶导数——显然,GFDM的这套思想还是非常简单自然有吸引力的。 好了,重点来了。近期,在SE帖子《How can I construct the derivative matrix for an irregular domain?》(编号:131705)下面,Ulrich Neumann 终于对GFDM作了尝试,这一尝试最终被整理成了一个基于GFDM法的微分矩阵计算程序包,代码如下: BeginPackage["GFDM`"]; taylorterms; matGFDM; Begin["`private`"]; taylorterms[dim_, order_] := Block[{t, f, vars, difforder, x, xlst}, xlst = x /@ Range@dim; With[{expr = Normal@Series[f @@ (t xlst), {t, 0, order}] /. t -> 1}, {vars, difforder} = Cases[expr, a : Derivative[o__][f][__] :> {a, {o}}, Infinity]\[Transpose]; {difforder, Compile @@ {{#, _Real, 1} & /@ xlst, (CoefficientArrays[expr, vars] // Last // Normal)}}]] w = Function[{d, dm}, #] &[ With[{x = d/dm}, If[d <= dm, 1 - 6 x^2 + 8 x^3 - 3 x^4, 0]] // PiecewiseExpand // Simplify`PWToUnitStep]; dmfunc[sf_, pcenter_, pinf_] := sf Sqrt[# . # &@(pcenter - pinf)]; matGFDM[dim_, order_, plst_, neighborsize_, sf_ : False] := (meshsize = Length[plst]; nf = Nearest[plst -> "Index"]; neighbors = nf[plst, neighborsize + 1]; {difforderlst, taylortermfunc} = taylorterms[dim, order]; With[{lst = difforderlst}, take = First@FirstPosition[lst, #] &]; diffmat = Function[indexlst, pcenter = plst[[indexlst[[1]]]]; If[NumericQ@sf, dm = dmfunc[sf, pcenter, plst[[indexlst[[-1]]]]]; wlst = w[Sqrt[((pcenter - Transpose@plst[[indexlst // Rest]])^2 // Total)], dm], wlst = 1.]; sparse = Module[{spa = SparseArray[{{Range@neighborsize, indexlst // Rest}\[Transpose] -> ConstantArray[1., neighborsize]}, {neighborsize, meshsize}]}, spa[[All, First@indexlst]] = -1.; wlst spa]; pinv = PseudoInverse[ wlst Transpose[ taylortermfunc @@ (plst[[indexlst // Rest]]\[Transpose] - pcenter)]]; pinv . sparse] /@ neighbors; With[{mat = diffmat\[Transpose], take = take}, mat[[take@#]] &]); End[]; EndPackage[]; 程序包的使用方式如下: (* 在给定的方形区域 mesh 上计算微分矩阵 *) << NDSolve`FEM` mesh = ToElementMesh[Rectangle[], "MeshElementType" -> "TriangleElement", "MeshOrder" -> 1]; plst = mesh["Coordinates"]; dim = 2; order = 8; size = 29; getmat = matGFDM[dim, order, plst, size]; // AbsoluteTiming (*{0.194138,Null}*) (* 提取混合导数 D[..., x, y] 的微分矩阵 *) dxymat = getmat@{1, 1}; (* 验算 *) Clear[x,y] f = Function[{x, y}, Sin[2 Pi (x - Pi/2)] Cos[Pi y]]; funcvalues = f @@ (plst\[Transpose]); dfunc = Function[{x, y}, D[#, x, y] &@f[x, y] // Evaluate]; ref = dfunc @@@ plst; dxylst = dxymat . funcvalues;dgfdmfunc = ElementMeshInterpolation[{mesh}, dxylst]; Manipulate[ Plot[{dgfdmfunc[x, y], dfunc[x, y]}, {x, 0, 1}, PlotRange -> 20, PlotStyle -> {Automatic, Dashed}], {y, 0, 1}]如大家所见,这个精度并不是特别理想,尽管数值基本能对上,但是误差肉眼可见(要知道这个计算足足用了29个点作最小二乘),并且这个精度似乎也远远不及GFDM相关论文中所声称的精度,至于是不是我对论文的理解有问题我就不太清楚了。 部分论文在计算时使用了权函数,但就我个人的测试结果而言,效果似乎不明显。 大家觉得是哪里出了问题? 另,在上述 131705 号帖子中还有径向基函数-有限差分法(radial basis function-finite difference, RBF-FD,也是一种以FDM后继者自居的方法)的编程尝试,效果也不是很好,有兴趣的童鞋可以看看。
【资源】《钢铁是怎样炼成的》章回体改编本《百炼成钢》 度盘链接的后半截(不知道这个要怎么用的请随便找个度盘链接观察一下格式): s/1Qnal-dNszgEs90296WqHgA?pwd=pbpb 书是用手机拍的,质量略糟,但应该不影响阅读。 这个改编本是个反面典型。方长安《〈钢铁是怎样炼成的〉在新中国“17年”的传播研究》中提到,出版总署在1954 年发布的《出版总署关于停止出版文学名著的改写本或通俗本的规定》中对其进行了点名批评:“……采用了章回小说的体裁和布局,而用许多缺乏生命力的腐朽词句作为回目,用许多陈腔滥调来代替原著的生动活泼的描写,歪曲了原著人物的真实的面貌”,然而,实际读完这个改编本后我发现——出版总署的这段批评未免太温柔了,这个改编本说是夹带私货蓄意歪曲原作都不夸张。我们来看几段典型的。 1. 36页保尔带冬妮亚参加工人聚会的剧情,原著中保尔面对同伴的指责时是为解冬妮亚做了辩护的,《百炼成钢》却改成了“保尔实在也用不到强辩”:2. 编写本按理来说是惜字如金的,但本书愣是在保尔家的部分原创了几段保尔向达雅他爹低头的情节:3. 原著中,保尔第一次去冬妮亚家,起初担心冬妮亚父母会不欢迎他,但实际上“冬妮亚还把保尔介绍给自己的母亲。事情并不像原先想象的那样可怕,保尔觉得冬妮亚的母亲也挺好”,《百炼成钢》却改变视角,来了番恶意揣度:4. 原作中战士们一起读《牛虻》的情节全部砍掉,改成了保尔“一有空就埋头读书,也不管旁人嘲笑他是书呆子”:5. 冬妮亚得知保尔被抓后的位置,抛弃原剧情,来了一段拉低冬妮亚全家人物形象的原创:6. 修路再会,保尔和冬的形象均被拉低——这段倒不见得是夹私货,可能真的只是文笔太差了:除此之外还有不少“有趣”的不同,大家可以自行寻找。
【水?】这条抛物线满足了什么条件?该条件可有简洁直观的表述? 最近在重看有限元相关的东西,结果在看到等参元这部分内容的时候发现了一个数学上的小问题,姑且拿出来水一帖。考虑下面这个参数方程: base = DeleteCases[{-(1/4) (-1 + s) (-1 + t) (1 + s + t), -(1/ 4) (1 + s) (-1 + s - t) (-1 + t), 1/4 (1 + s) (1 + t) (-1 + s + t), 1/4 (-1 + s) (1 + s - t) (1 + t), 1/2 (-1 + s^2) (-1 + t), -(1/2) (1 + s) (-1 + t^2), -(1/2) (-1 + s^2) (1 + t), 1/2 (-1 + s) (-1 + t^2)} /. t -> -1, 0][[{1, 3, 2}]] (* {1/2 (-1 + s) s, 1 - s^2, 1/2 s (1 + s)} *) 这个方程有如下性质:s为-1时,第1项为1,其余项为0;s为0时,第2项为1,其余项为0;s为1时,第3项为1,其余项为0: Table[%, {s, -1, 1}] (* {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}} *) 不难意识到,利用这个性质,我们可以轻易构造出一条过平面内任意三点的曲线。好了,(至少对我这学渣而言)神奇的事来了:稍加尝试我们会发现,这条曲线的方程可以写成不含参的隐函数形式,并且它居然还是根抛物线(这里我们忽略退化的情形): coord = ({Subscript[x, #], Subscript[y, #]} & /@ Range[3]); eq = Collect[Expand@Eliminate[base . coord == {X, Y}, s], {X Y, X, Y}, Simplify]Cases[eq, a_. X^2 + b_. X Y + c_. Y^2 + d__ :> b^2 - 4 a c, \[Infinity]] // Simplify (* {0} *) 现在问题来了:我们知道,要在平面内确定一条一般化的抛物线应该需要5个方程(a X^2 + b X Y + c Y^2 + d X + e Y + f ==0, b^2 - 4 a c == 0),但我们确定这条曲线只用了3个点,这说明上述构造过程还隐含了2个限制,这两个限制是啥?有没有简洁直观的表述?
如果符号解算不出来且符号解不是必须的,试试数值解 这个也是讲烂了的内容,但吧里好像没有标题足够显眼的帖,姑且专开一帖,方便索引。 比较常用的“超级函数”基本都有与之对应的数值求解器。如标题所说,如果符号解没算出来并且符号解对你来说不是必要的,那么不妨去试试数值解。 只写这么几行的话内容好像太少,那就再稍微谈一下比较常见的成对的符号/数值求解器及其特性。 对于代数方程:Solve(虽然现在已经发展成了超级求解器,但它主要是个多项式方程求解器)/NSolve(引入时间非常晚,目前在某些方程上的表现反而不如Solve,但对部分类型的方程可能有奇效,具体看帮助)、FindRoot(需要初值,优点是差不多是个方程就能解,但方程性质不好照样会跪) 对于微分方程:DSolve(虽然近几版明显改善,但依旧是符号求解失败重灾区)/NDSolve(性能强劲,但某种意义上也是把人骗进去杀的玩意儿) 对于积分:Integrate(性能强劲,但是积不出来的积分就是积不出来)/NIntegrate(性能强劲,最近的加强应该是有限元法的引入,但是自从版本8引入LevinRule后好像就没有了针对特殊类型积分的改进。) 对于极值:Maximize、Minimize/NMaximize、NMinimize(全局算法,无需初值,"DifferentialEvolution"法有时有奇效,新引入的"Convex"法值得关注);FindMaximum、FindMinimum(这俩需要初值) ……成对的函数当然不止这些,不过我现在累了,今天先到这儿。
NDSolve解不出来的东西,你也别指望经典龙格库塔能解! 如果你: 1. 看到某某人/某某书/某某文章用了龙格库塔法,所以决定也要用龙格库塔法; 2. 试图用NDSolve解某问题却失败了,所以决定还是用龙格库塔法; 3. 压根不知道NDSolve是什么,以为求解微分方程 = 编个龙格库塔法; 4. 觉得龙格库塔就是好,就是好,就是好! 那么,请记住,经典龙格库塔法(classical Runge-Kutta,RK4,文献里提到了“龙格库塔法”“四阶龙格库塔法”却没具体说明算法细节时一般也都是指它)很大程度上只是一个教学方法,它的性能(不论是速度还是精度)都是无法与NDSolve的默认方法相比的。如果只是需要解微分方程/微分方程组的初值问题,请直接使用NDSolve。NDSolve解不了的问题,你也别指望经典龙格库塔会起效。(过往十年我没见过哪怕一个疑难问题是靠切换成经典龙格库塔解决的。) 当然,在某些特殊情况下经典龙格库塔还是有“市场”的,比如有时我们需要精确重现某些文献的结果(指连数值误差之类的都准确重现),又比如有时我们可能会需要保证自己的结果也能被别人简单地重现。这种时候我们依旧可以使用NDSolve,因为NDSolve是可以通过设置具体选项来调用经典龙格库塔法的,具体可以参看自带帮助中的教程《NDSolve 的 "ExplicitRungeKutta" 方法》(tutorial/NDSolveExplicitRungeKutta),另可参考stackexchange帖子《Solving a system of ODEs with the Runge-Kutta method》: mathematica.stackexchange.com/a/23583/1871 啥?“我要写龙格库塔法没啥高大上的理由纯粹是为了交作业哦对了我们老师还要求我们用For循环”?…………
“二维表达式从软件里拷出来就变乱,怎么办啊!”高级篇 虽然置顶也说了,看似杂乱的代码只要贴回Mathematica的笔记本里就会恢复原状,但是代码贴出来通篇的 ! 和 \ 还是让人有点不爽不是?虽然复制前先按 Ctrl+Shift+I 把代码换成 InputForm 可以在一定程度上解决这个问题,但还是不够好(毕竟整页的*也挺烦人,而且这还会导致某些排版丢失),因此这里以 D 和 Derivative 为例介绍一个高级解法: MakeBoxes[Derivative[n_Integer?(Between[{1,4}])][f_],StandardForm]:=With[{p=StringRepeat["\[Prime]",n],q=StringRepeat["'",n]},TemplateBox[{MakeBoxes[f]},"Derivative1",DisplayFunction->(SuperscriptBox[#1,p,MultilineFunction->None]&),InterpretationFunction->(RowBox[{#1,q}]&)]] MakeBoxes[Derivative[n__Integer][f_],StandardForm]:=TemplateBox[{MakeBoxes[f],RowBox[BoxForm`MakeInfixForm[{n},",",StandardForm]]},"Derivative2",DisplayFunction->(SuperscriptBox[#1,RowBox[{"(",#2,")"}],MultilineFunction->None]&),InterpretationFunction->(RowBox[{RowBox[{"Derivative","[",#2,"]"}],"[",#1,"]"}]&)] Unprotect[D]; FormatValues[D]={}; MakeBoxes[D[expr_,x__],StandardForm]:=TemplateBox[{MakeBoxes[expr],RowBox[BoxForm`MakeInfixForm[{x},",",StandardForm]]},"D",DisplayFunction->(RowBox[{SubscriptBox["\[PartialD]",#2],#}]&),InterpretationFunction->(RowBox[{"D","[",#,",",#2,"]"}]&)] Protect[D]; 参看 mathematica.stackexchange.com/a/231436/1871 mathematica.stackexchange.com/q/268886/1871 上述代码可以放在 SystemOpen@"init.m" 文件里,这样就不用每次都重新执行了。 其它拷出来就变乱的二维表达式(积分,微分算子……)也可以依此思路修正,大家不妨试试。
Mathematica“某一天突然不能用了”集中讨论帖 考虑到此类问题和“Mathematica已经装好了,但不能用”即“Mathematica一开始就不能用”有一定区别,特开专帖讨论。今后此类问题 原则上请不要单开主题。 这里的“不能用”,包括不限于 1. Mathematica 突然无法正常打开 2. Mathematica 突然变得无法正常工作(1+1也算不了等) 3. Mathematica 突然在执行正确的代码时出现莫名其妙的警告。 如果你的“Mathematica 一开始就不能用”,请看置顶。 闲话少叙,说一说可能的修复方法: 此类问题似乎和Mathematica的Paclet更新不当有关。多数情况下,只要给Mathematica来个clean start( 启动Mathematica时按住Ctrl和Shift;如果是通过命令行启动,则运行 mathematica.exe -cleanstart )即可。 另一个可能有效的办法,是打开 %APPDATA%\Mathematica\Paclets\Configuration 路径(没错,这个%APPDATA%也是一种地址,不信你把它贴到Windows文件夹顶部的那个框里回车下试试。更多内容请自行百度),将其中的 pacletSiteData_10.pmd2 文件删去。 如果想要预防此问题,可以考虑将顶部菜单 编辑 -> 偏好设置 -> 网络与邮件 -> 自动检测数据更新 给关掉——Mathematica会通过Paclet修复一些小bug,所以,可能的话尽量别关,但如果你网络环境很糟以至于Mathematica三天两头地“突然坏掉”,那或许还是关掉更好。 我知道的修复方法就这些。(我自己几乎没有遇到过,所以没什么经验。)欢迎诸位补充。 如果本帖的方法无法修复你遇到的问题,请回帖说明你的情况(Mathematica版本,操作系统版本,出错的具体情形等),不要另开新主题。
【交流】Mathematica公式转为Word公式出错时的应对方法 我们知道(好吧,可能也不是人人都知道),Mathematica里的公式是可以直接Ctrl+C, Ctrl+V贴进Word里面的(当然,这是近几个版本的事,至少版本9时代我们得手动选择“复制为 -> MathML”,参《【交流】Mathematica版本10以来的某些悄悄改变》10楼:tieba.baidu.com/p/6249308172):这个功能很多时候是方便的(比如上面这个偏微分方程,即便你在Word里设置了恰当的简写和模板,输入效率也不见得比得过Mathematica),但是,就像几乎所有软件与软件、语言与语言间的交互功能一样,这个“Mathematica公式转Word公式”的功能并不完美——不,应该说出错的时候并不少,因此,本帖主要想和大家做两方面的交流: 1. “Mathematica公式转Word公式”在什么情况下会出错? 2. 对于此类错误,有没有好的解决方法? 是否有可能通过修改Mathematica中与前端(FrontEnd)有关的函数来进行“修复”? 照例由我先说一个例子吧。如果我们将TraditionalForm的 a==b 给贴进Word里,就会出现对于这个问题,我能想到的解决方法有两个: a. 在书写公式时避免使用==。如果我们只是把Mathematica作为公式输入器,这点自然不难做到,但如果我们是在把已有代码的一部分转为TraditionalForm,这就不那么方便了。 b. 用vba替换: Sub fixformula() With Selection.Find .Text = ChrW(63449) .Replacement.Text = "=" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = True .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False .MatchFuzzy = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub 最后,本帖暂不打算包含对逆过程(即“Word公式转Mathematica公式”)的讨论,毕竟排版语言转编程语言出错概率太高了。
关于蕾为什么叫蕾的一些瞎猜 免责声明:以下内容全是瞎猜,毕竟作者本人不亲自解释,这些名字的词源我们终究是无从确定的。 众所周知,《武器种族传说》的故事发生在架空世界里,里面的人名地名也都是作者编的。但编名字不可能凭空编,作者取名时必然借鉴过现实世界的人名/地名/词汇,比如男主角酷的全名“酷德·望·朱鲁艾特(クード=ヴァン=ジルエット)”,这个“望(ヴァン)”明显是来自荷兰语的“van”(顺便范德瓦尔斯的“范”和梵高的“梵”都是van的音译)。那么,蕾的全名“蕾芙丽·梅扎兰斯(レヴェリー=メザーランス)”是怎么来的呢? “蕾芙丽(レヴェリー)”是比较好猜的,它的发音显然指向英语单词reverie,英文版动画也使用了这个词作为蕾的译名。这个词的含义有“遐想,幻想,梦幻曲”,与蕾的人设相符。 梅扎兰斯(メザーランス)这个姓氏就比较麻烦了。从英文版动画译名“Metherlence”出发去考据并没有什么收获。以下是一个比较大胆的猜测:酷的名字受了荷兰语的启发,那么蕾的名字或许也和荷兰相关,而荷兰在英语中是“Netherlands”。“ランス”在日语里可以用作“lands”的转写,例如“landscape”的片假名表记就是“ランスケープ”,这便构成了姓氏的后半部;而姓氏的前半部“メザー”可能脱胎于“目指す(めざす)”(以……为目标),与lands合起来就是目标之地,这和整部漫画的主题也是相符的。
你知道Mathematica里有三种换行吗?你真的知道换行的含义吗? Mathematica里是可以在一个函数里包含多条语句的, 只要使用 ; 和 () 就行!一个简例(这当然只是个例子,Abs已经内置了): abs[c_] := (re = Re[c]; im = Im[c]; Sqrt[re^2 + im^2]) abs[1 + I]看到这里,吧里的老人大概会会心一笑,而其他人想必是一头雾水:这帖标题不是要说换行吗,这跟你上面说的东西有什么关系?当然有关系,请耐心往下看。 Mathematica里其实有三种换行,它们是: 1. “完整语句”外的换行。这种换行代表了语句的结束。比如下图这里的 a 和 b 由换行分隔成了两条语句。(这点由前面的行号54和55也可以看出来:每个行号都对应了一条完整语句。) 2. “完整语句” 内的换行。这种换行仅仅是一种 排版(语句较长时适当换行可以使代码变得易读),不能分隔语句,比如下图Log[2, 4]内部有一处换行,但并未影响输出。 换行的前后如果没有逗号或其他算符,Mathematica会认为我们在做乘法,比如:当然了,这种换行并非毫无限制,比如二元算符得在上面那行,否则会出错:如上所示,前一种写法被正确认作a除b了,而后者软件报错。 “那么,你手里有没有完整的限制列表呢?”很遗憾,没有,自带文档里好像也没写。(顺便,深究起来,自带文档对某些 极度基础的内容确实缺乏 明确的叙述,个人认为这其实是对自学造成了障碍的。)不过,Mathematica的笔记本在宽度不够时默认进行的就是这种排版,所以手调笔记本宽度不失为一种确认排版规则的方法。 好的,重点来了。我们知道,Mathematica代码纵然看上去千奇百怪,但实质上都是形如 a[b,c,…] 的结构的无限嵌套。这种嵌套可以使用FullForm来检查。比如:又比如你没看错, 分号在Mathematica里其实是个函数。 自定义函数也不例外:明白这意味着什么吗?这意味着你在 定义一个函数时, 不同于MATLAB或是fortran或是其他的啥 , 你是不能靠换行来分隔语句的。“没错!所以Mathematica定义函数时是不能写多条语句的! -> Mathematica里是不能定义复杂函数的!-> Mathematica搞不了正经编程! -> Mathematica是个计算器!”——这便是Mathematica初学者 次常见掉坑路径之一。“那么在一个函数内写下多条语句的正确方法到底是啥呢?”这便回到了我们开头的话题。 顺便,自带文档中也存在着大量的“复杂”函数定义示例,稍微多看两眼就能遇到,比如下面的例子,出自“ = ”的文档:所以说,最后还是那句老话, 自带帮助是最好的教材。
1 下一页