我是怎样学起Mathematica来
mathematica吧
全部回复
仅看楼主
吧务
level 15
xzcyr 楼主
本文系自此帖(https://tieba.baidu.com/p/2736346260)5楼的回复修订增补而来。吧里的老人们阅读本文时可能会觉得各种眼熟:毕竟重要的经验我都是不断强调的。
我最初会得知Mathematica的存在,是因为《数学建模》老师在课堂上的推荐。我第一眼就被它那极度接近传统数学式书写的使用方法给吸引了——相信这个吧里的许多人也是一样。《数学建模》结课后不久校内就搞了数学建模大赛(目的是为了选拔参加全国大赛的选手),我就参加了,用的当然是Mathematica。
注意这时的时间点是快三年前,也就是2012年的上半年,那个时候具有全中文帮助文档的Mathematica 8已经出世,但是,版本8的体积比之前的版本要大,于是我这个吝啬鬼想了半天最后
错误地选择了版本7,并从图书馆借了一本《Mathematica7实用教程》,觉得这样应该也够用了。
比赛时间是三天,我所属的组在最后一天算是弄出了模型,然后,解不出来。
站在现在看来,这一局面是理所当然的,因为我那时对Mathematica的使用,几乎是胡来,因为Mathematica的代码接近传统数学式,我便
想当然的在Mathematica里写起了传统数学式。我还能记得的在这一时期犯过的错误——实际犯的肯定不止这些——有:
为了获得纯正的传统数学表达,大量依赖TraditionalForm和自由格式输入。
以为在代码的开头写上 a ∈ Integers 就可以使 a 被全局声明为整数。
不会清变量,对语法着色也毫无概念,只好通过反复重开软件来使软件“恢复正常”。
…………
总而言之,那时的我对
Mathematica其实是一种严谨的编程语言这点可以说是完全没有认识,而那本
万恶的《Mathematica7实用教程》也基本上只是把Mathematica当成一个计算器在介绍,这便进一步封死了我认知自己错误的路。参赛的结果,也就不消我多说了吧。这次失败让我陷入了强烈的沮丧之中,从此一厥不振,Mathematica成为了我心中又一段不堪回首的记忆——要真是这样我现在就不会在这儿了,故事当然还有后续。
这次经历固然让我受到了打击,但也让我感到了不甘心,结果,Mathematica还是留在了我的电脑里没有删掉。不久,我所在的教研室迎来了一个组会日,我那时还没进实验室,手上没什么东西可讲,搜肠刮肚,我忽地想起自己本科毕设时的一个问题可以用Mathematica来解决,就拿这个当材料做PPT了。
注意,这个问题是连当时的我也能自力解决的问题,不消说,它是十分简单的。(实际上就是用Reduce求解整数不定方程。)但是我却忘记了自己当初是怎么被形如Solve[x^3 + 2 x^2 + 3 x + 4 == 0, x]的代码迷得神魂颠倒,不知道这一切在旁人眼里是多么的神奇,没想到自己已经被选为了目标……暑假临近时,导师忽然找到了我,让我帮忙解一个数学模型。我在这个时候才得知,教研室内部不知何时起已经流传起了一个奇怪的传闻,说是我参加建模大赛获奖了囧。
“既然导师信任我,那我就不能辜负人家的期望”——这种假话我当然说不出口,但是我拼命想要快点解完这个模型那是千真万确的,因为,我想回家。毕竟这是我大学以来第一次暑假没家回,虽然理性上清楚这对研究生来说是正常的,但是感性上这就好像一直拥有的权利突然被剥夺了一样浑身难受。我所要求解的模型实际上是一个偏微分方程组,我一看到这个问题自然想起了NDSolve(《实用教程》介绍了这个函数)。“那就赶快把方程塞进这个指令里解出来然后回家!”我第一时间
把电脑里的Mathematica换成了版本8——我在这个时候已经意识到了纸质教程的内容恐怕会不足,而且在回家的诱惑面前硬盘空间当然是浮云——输入方程,Shift+Enter,我得到的是——一大片的警告。
但是此刻我已经不是几个月前的我了!几个月前的失败也就是浪费几天时间,这次可是关乎回不回得了家的大事!……而且,或许是不断的失败使我在潜移默化中有了反省,最终我竟基本冷静了下来。我开始意识到我面临的其实是复数个问题的集合,
贪婪地想要一口气把问题彻底解决是不现实的。于是我开始读着自带帮助和网上看到的各色杂七杂八的资料开始了跌跌撞撞的探索。基本掌握Mathematica的最基础语法并没花掉我很多时间,可是,还是不够……我最终开始在百度知道上提问(这算是Mathematica学习再开后的第一问:http://zhidao.baidu.com/question/447269535.html)。
读到这里,或许会有读者对我此时的选择嗤之以鼻或是感觉不理解:一个学术问题,怎么想到跑百度知道上来问了?为什么不问问你的同学和老师呢?比如你的《数学建模》老师?关于这点,一个原因是我的身边没有什么人会Mathematica,而《数学建模》与我甚至不同院,当时还是暑假,我怎么好意思去麻烦别人——好吧,这其实是借口,说白了我就是从小怕老师怕惯了,所以对找老师这事有抵触——不过,现在看来,即使我当时选择这条路,等在我前方的恐怕依旧是死胡同,说句听起来有些不知天高地厚的话:我丝毫不认为在课堂上教我们破解版本4(还是版本3?记不起来了)Mathematica的老师能够给我帮什么忙——当然了,也可能他会因此为我介绍一位新的老师,最终闯出一条新路……遐想就到此为止,历史不容假设,而且我丝毫不后悔我当时的选择。
虽然困难,但我开始将我要求解的问题一点一点的分解开,放到知道上提问,虽然得到的答案并不总是如意,但是还是有收获的,至少我开始对我所面临的问题的难度以及其中重大的难点看得越来越清楚了——
百度知道并不像某些人想的那么糟糕,还是有人在认真的回答问题的。这里要特别感谢 @tryytr ,尽管他对我所要解的问题并不熟悉,却依旧在这段我最为艰难的时期积极地与我进行了多次探讨。(比如这里:http://zhidao.baidu.com/question/452380013.html 和这里:http://zhidao.baidu.com/question/455225843.html )但是,依旧不够……有的问题不解决我还是回不了家……就在我再度陷入僵局,甚至在漫天飞的“Matlab更擅长数值计算”的
流言影响下装上了Matlab的时候,神( @yang_bigarm )出现了!:
(这个提问因为最终含了外链被百度和谐了,所以这里只贴个图。)
得知
Stackexchange的存在(由stackoverflow找到mathematica的分站去并没花掉我多少时间),可以说是我学习Mathematica过程中最重要的
转折点——今天看来,我所要求解的模型中所蕴含的问题,其实是超乎想象的,其中的许多内容至今没有彻底解决。(鉴于其复杂度以及吧里关心偏微分方程问题的人员稀少度,此处按下不表。)但是,mathematica.stackexchange的成员们的实力,同样超乎想象。通过在Stackexchange的提问,我所面临的主要问题均得到了解决。(这是其中最重要的一个:http://mathematica.stackexchange.com/q/9277/1871 ,我至今认为这是我在Stackexchange的最有价值的提问。)——而这,依旧是次要的,更重要的是,在我在Stackexchange阅读帖子的过程中,
我对Mathematica的热情再度迸发了出来。
诚然,我在首次接触Mathematica时也曾为之着迷,但那更多的是被它的光鲜一面给吸引,没法长久,而这一次,我是在幻想破灭之后,
被Mathematica真正的强大吸引的。同时,对于一些基本原则的掌握也使我有了进一步学习的资本。(比如
勤查自带帮助这一点——这也是stackexchange的各位强人们在不断强调的。)我再次迎来了一个学习Mathematica的高潮。
我一面
在Stackexchange大量阅读帖子,一面开始在百度知道疯狂答题(之所以那个时候没在Stackexchange答,一来是因为本身实力不济,二来是因为那时候Stackexchange开站不久,原始会员们答题远比现在积极,我根本抓不到机会),那时我的答题近乎饥不择食(话说那段日子里抢了 @yang_bigarm 不少“生意”真是不好意思……)
,甚至连要注册码的问题我也来者不拒(http://zhidao.baidu.com/question/492396412.html),现在看来,这种做法无疑造成了一定的
负面影响,那就是这种无差别答题给我造成了巨大的精神压力,以致我在某个时期回答他人问题时的态度很不好(啥,现在也不咋的?……总之比那时候好多了吧。这都是靠着我如今对答题时间的限制),但是,不可否认的是尝试
回答他人的问题确实是一个让自己快速进步的方法。
我在这一时期的进步是非常快的,毫不夸张地说,我每阅读一个Stackexchange的帖子,每回答一个百度知道的问题,我都能切实地感觉到自己比上一刻更懂Mathematica。到了大约十月的时候,我已经打遍百度知道无敌手了(我不否认这和百度知道上的提问总体容易有关,其实在我在知道上开始答题后的很长一段时间里,甚至连Table都不能熟练使用:http://zhidao.baidu.com/question/475944231.html)。同时百度知道有的时候还是会冒出一些困难得光靠自查帮助解决不了的问题的,这种时候我就会把问题搬到Stackexchange去——我就是靠着这个到手了我在stackexchange的第一个nice question:http://zhidao.baidu.com/question/499080092.html http://mathematica.stackexchange.com/q/15021/1871 。顺便这一时期我最重要的回答是:http://zhidao.baidu.com/question/505315229.html
再往后的事,就波澜不惊了。先是把答题的战场扩张到了贴吧。(我曾因为一些历史原因,犹豫了很长时间是否要进驻贴吧,但是知道上的问题已日益无法满足我的需求,最后,“管他呢!”顺便这大概是吧内第一帖:https://tieba.baidu.com/p/1950670750)然后又开始
阅读Leonid Shifrin写的那本书。(我已经记不起来最初是因为什么才开始读这本书的了,不过,长时间在Stackexchange摸爬滚打,接触到这本书绝对是时间问题。)大概到了年底,也就是正式开始学习Mathematica约半年的时候,我发觉自己的进步速度似乎慢了下来——其实可学的东西还有非常非常多(https://tieba.baidu.com/p/2025917205),但是对软件的学习毕竟受限于自己的知识和兴趣——再往后,我的Mathematica技能的进步进入了一个比较平缓的时期,经常很长时间都没有什么显著的进步,当然,绝不是没有进步,实际上,包括编译、模式匹配在内的许多重要内容我都是在这一时期学会的。(关于模式匹配,必须要感谢 @33珊珊2013 于2013年3月前后在知道的一系列问题的促进作用。)
以上,就是我学习Mathematica的主要过程的一个啰啰嗦嗦的回顾。如今的我虽然不再是个新手,但是和Stackexchange的众神相比还是有着光年级的差距,即使是在吧里,我也绝不是最强的。(不知道全吧打排位赛的话能不能进前十啊……)我在学习过程中走了不少弯路,某些做法也不见得对,不过,若是各位能从这个帖子里吸取到些许经验或教训,我会非常高兴。
凡是在本帖下面仅回复“太长不看”或类似词句者,删。
最后的最后,依旧用从前在 @青衣瓦屋 的帖子下面胡诌的小诗做结吧:
假如StandardForm欺骗了你,
不要悲伤,不要心急!
出错的日子里需要镇静,
相信吧,习惯InputForm的日子将会来临。
2014年12月06日 14点12分 1
level 8
支持楼主,希望以后共同交流。
2014年12月06日 14点12分 2
上周我用MMA编了一段程序,设计了一个算法,用来测量三维凹坑的最大深度和体积,可以将激光测量仪器获取的数据读取并计算,输出最大深度和体积到excel文件,并且在mma中生成二维凹坑截面和三维形状,精度达到千分之二,领导高兴坏了,呵呵。重新拾起mma,以前还是用的4.0
2014年12月06日 14点12分
下一步目标我要将visual studio和mma连用,开发实用的商业程序,呵呵
2014年12月06日 14点12分
领导看见mma一下能解出各种方程还能画图,很惊讶的样子,我觉得这些对mma来说都是最简单的功能,像你说得,计算器而已。mma8的中文帮助确实牛逼,现在基本上手了,单位xp系统只能用8.0,不过自己家用10.0,帮助文件很酷
2014年12月06日 14点12分
回复 Avina731 :xp可以用9啊
2014年12月27日 13点12分
level 8
你说的那本Leonids Shifrin的书能给我电子版么?我邮箱30302709@qq。com
2014年12月06日 14点12分 3
关于Leonid的书,请看这里:https://tieba.baidu.com/p/3230448463
2014年12月06日 15点12分
level 1
啊。新人必备错误,那一段,写的蛮好的。。。
2014年12月06日 15点12分 4
level 13
感人[乖]
2014年12月06日 16点12分 7
level 11
原来真正的大神是这样练出来的...
我开始接触Mma是高三暑假,之前关于编程方面的只是稍微接触过一点C。反正当时没事就是玩呗,我是物理竞赛出生,那么就开始尝试去解一些当初竞赛时遇上的手动无法解的题,做一些题目结果的可视化等等之类。当时的情况要么是写上两三个函数就完了,要么就是把Mma当成C用。
大一上的时候,也基本没什么需求,就是拿着Mma复算一些别人的东西,比如说https://tieba.baidu.com/f?ie=utf-8&kw=%E5%9B%BD%E5%AE%B6%E7%89%A9%E7%90%86%E9%9B%86%E8%AE%AD%E9%98%9F&fr=search 这个贴吧中椰路沙冷贴的那些玩意,比如说http://www.withparadox2.com/ http://www.matrix67.com/这两个blog中早期的一些东西。
到了大一下了嘛,很大一部分精力放在了CUPT上面,那就有建模的问题了。当时花的时间最多的是用边界元法求解一个含时的偏微分方程。由于问题是随时变边界的,我想着Mma应该不自带这么强大的函数吧,然后就自己开始写了。从寒假开始写,到开学一个月后de完所用bug,然后那个程序现在自己完全不能看,完全就是在把Mma当C使吗(当然,毕竟大一上刚学了一门C++),除了调用了一些特殊函数和可视化。
然后就是这学期有一门数据结构与算法,有大量的上机作业并要求上机报告,由于同学间的恶性竞争,结果的可视化反而变成分数的一个重要评判标准了,因此在这段时间又钻研了好一会儿绘图和动态图。
大一暑假的时候受吴崇试老爷子的委托帮他要再版的那本数学物理方法重新绘图,很遗憾暑假事多,只完成了一半左右的任务。当然数十张图,各种选项的修改,确实是一个很好的训练。
然后到了现在...虽然说进组了所需要的计算任务变大了数个数量级,但是老师却给了我们一个商用工程软件comsol,然后这家伙只能连接Matlab...所以说Mma现在在我手中还是一个可视化的工具...sigh...
2014年12月08日 01点12分 9
话说你说的那个关于边界元的问题我也有兴趣,你有空的话不如把原问题简化下然后在吧里开个相关帖之类的。
2015年02月08日 13点02分
@xzcyr 行,过两天我把代码整理一下,然后写一下具体内容
2015年02月08日 14点02分
@xzcyr 仔细想了一下整个问题想说清楚似乎不大简单...这是一个含时,变边界(随时变,变化量根据方程的解而定)的拉普拉斯方程的求解,时间上我用的是一次差分,空间上用的是边界元法。这是最后的结果图(最后一楼)https://tieba.baidu.com/p/2254842535
2015年02月11日 12点02分
2015年02月11日 12点02分
level 6
细度了 xzcyr 朋友的帖子, 也很有感触. 感觉上每个人学习 Mathematica 之路都并不平坦, 每一次 Shift + Enter 的之后, 有多少叹息和欢呼也只有自己知道, 不过这样一路下来却也感到非常值得.
2014年12月09日 00点12分 10
level 2

2014年12月09日 02点12分 11
level 1
恩....原来理科生也可以那么文艺。
我只想套用你的那个诗:
假如Mathematica报错了,
不要悲伤,不要心急!
出错的日子里需要冷静,
检查每段代码,每个循环,
变蓝的变量就像一个个蓝精灵,
copy+paste也会报错,
真让人又爱又恨。
2014年12月23日 05点12分 13
好久不见!……不过循环还是尽量别用了吧。
2015年01月03日 11点01分
level 1
头衔名字挺搞笑的,有才!
2014年12月23日 05点12分 14
level 11
MARK
2014年12月28日 06点12分 15
level 11
数学建模真的是很锻炼人的事情啊~
2014年12月28日 06点12分 16
level 9
谢谢。
Stephen Wolfram,今年55岁了。又是一代人过去了。
MMA的结构跟易等同。
可是,我一直没有用心学。
失败。
2015年01月01日 00点01分 17
level 11
[真棒]顶一个!
2015年01月02日 15点01分 18
level 4
挺认真地看完了吧主的故事,我自己是前两天才接触这个软件,看了入门教程后被深深迷倒后激动不已找老师聊天,说的天花乱坠之后!老师不理我了。。。老师是常微分老师,提供了一个用Maple或这个Mathematica求解或近似解的课题,难怪他不鸟我?因为他不用这个软件?可能是我太激动,话太多,他回不过来干脆不回了吧。。。我也大三了,数模已经远去,我本着大学的自由,可以自由学习,但是发现自己过于天真,这次,快期末了,我却迷上了Mathematica,不管什么作业不作业,硬是把教程视频看看玩,自己操作了一下!感觉真的学到了一些什么,不是为了绩点!
2015年01月03日 06点01分 19
不容易,可以保研后好好学。大四上很轻松的,一般来说
2015年03月17日 03点03分
@sliver00 这种成绩怎么保研啊- -
2015年03月23日 10点03分
level 1
刚开始学习Matlab,也刚了解Mathematica,给顶了
2015年01月11日 03点01分 22
level 7
我是新人,在学习,看到大神的往昔,我感同身受……
2015年01月14日 15点01分 23
level 8
感人,我也要像楼主一样。努力,同努力。加油加油。大家!!
2015年01月15日 14点01分 24
1 2 3 尾页