这是我18年给同学写的一个学习文档,所以里面有不少搬运的东西,现在看还行,凑合着看看吧。里面的代码(两个趣味游戏)和一些帖子基本都是别人做的,我只是搬运了一下。
如何学习mathematica
一些网址:
知乎:https://www.zhihu.com/question/55683496
博客的前后文也值得一看:
博客,关于张量运算的程序包:http://blog.csdn.net/stereohomology/article/details/16848805
博客,关于mathematica编写自定义程序包的模板:http://blog.sina.com.cn/s/blog_5701c6010100npyy.html
http://blog.csdn.net/gw569453350game/article/details/48731673
装一个中文版的mathematica,如果你英文特别666,也可以装英文版,但别想着“我英文不好,装一个英文版,学mathematica时顺便学一下英语”,你是初学者,学的是mathematica,不是英语。如果系统 比较 新的话(win7及以上)推荐装最新版的mathematica(目前是11.3,改:目前是12.0)。或者至少要安装10.3以上的版本,因为这些版本支持中文搜索。资源可以到mathematica百度贴吧中,置顶那个就是。安装什么的很easy,自己解决。
首先,推荐直接看mathematica自身的核心语言参考书初级部分。其次也可以自己在网上看一些ppt/pdf等文档,或者看一些中文书(最好是pdf版的,因为没有必要买一本全书,中文书籍都是把mathematica当成计算器来使用,太浪费了)。中文资料可以参考贴一当中的零基础入门文档。当能用Plot画几个图,能用Solve解几个方程时就不必再看。
这样你就初步学会了mathematica,中文书什么的也就别看了,否则你就入坑了,永远停留在那个水平。(我是2018年写这篇文章的,那2018年以前的中文书都别买了,这时mma11.3中文版出来了,但说不定以后会有好的中文书,那时的初学者也可以买好的中文书)。既然初步学会了,接下来就是痛苦的进阶过程了。Mathematica的特点是上手特别容易,但进阶就很难了,所以很多人的水平也就是初级水平了。有必要说明一下,此时虚拟全书(好像版本10以后改为 Wolfram参考资料了)、核心语言库以及帮助文档仍然是最好的学习资料。如何由初级到进阶,就看看下面的一些文章吧。
(*注意mathematica11.3的帮助栏下Wolfram参考资料新增了一些更适用于学习的一些操作,如下图。
*)
贴一(来源于百度贴吧,时间久了,忘了作者,不过还是要谢谢原作者):
===怎样开始学习===
这里假定你装的是中文版,中文版最大的好处就是帮助是中文的。如果你是第一次接触Mathematica,也许会对只有一个菜单栏的界面摸不着头脑,更别说使用查找帮助了。
所以这里我们为大家准备了一个零基础入门的文档(下载地址 )。这个文档包含了一些最基本的知识,能给你一个关于软件的基础的认识。也许在文档的最开始有一些你看不懂的东西,完全不要着急,看不懂的代码直接跳过去即可。
看完了这个你应该会在“笔记本”里输入简单的代码并运行了,更重要的是你应该会使用内置的帮助了,内置的帮助包罗万象、内容纷杂,初入难免晕头转向迷失其中。其实自带帮助里是有一份循序渐进的教程的
,点击菜单里的“帮助”->"虚拟全书" 便可进入这本书的目录。
虚拟全书是非常棒的入门教材。虚拟全书里的例子是可以运行的(整个帮助里的例子其实都是可以运行的),阅读过程中你可以随时修改里面的例子看看结果有什么变化。不必担心你的修改会弄坏帮助,修改的内容都是不会被保存的。虚拟全书里的内容足够你慢慢地熟悉并使用Mathematica,重点看”核心语言“那一部分,其他的内容就主要看你的用途和兴趣了。关于核心语言的重要性,后面会强调。
===纸质书?===
这里说的”书“指入门类的书。
关于Mathematica的中文出版物非常少,而且质量不是太好。如果你打算认真地学习Mathematica的话,强烈建议你直接忽略市面上的那几本中文教材,具体的原因你将来会知道的。所以,如果想弄一本纸质的拿在手里读的话,可以考虑打印一本虚拟全书的核心语言部分(pdf下载地址 )。
有的人可能有在平板/手机/kindle上阅读的需求,上面的pdf适合打印,但是在移动设备上看字太小了,这里准备了一个字比较大的版本(pdf下载地址)
如果能读英语的话,推荐打印这个网页里的帮助文档
英文pdf版。
如果身边的打印店太贵的话,可以考虑网上打印。
===遇到问题哪里问?===
A. 首先考虑自己解决。
1. 在自带帮助里搜索相关的内容。
2. 自带帮助的搜索结果可能不尽人意,不尽人意的原因不一定是帮助里没有相关的内容,而是自带帮助的搜索能力,特别是对中文的搜索能力太差了。这时可以利用搜索引擎(百度就可以啦)的站内搜索功能检索参考资料中心的在线版。方法是在你搜索的关键词前上”site:http://reference.wolfram.com",例如"site:http://reference.wolfram.com
解方程" 就会返回这个结果。
3. 百度 (Mathematica在网上的中文内容比较少,所以找不到你想要的结果也不要灰心)
4. google 英文关键词,这一点可能对初学者比较困难,因为和Mathematica的相关一些英文术语你不一定熟悉。
B. 中文论坛
新科学网
百度Mathematica吧
果壳Mathematica小组
豆瓣Mathematica小组
C. QQ群
关于QQ群,优点是问题解决的速度比较快,缺点是有价值的讨论是非公开的,别人搜索不到。
在QQ的群查找功能中输入Mathematica关键字即可。
D. 国外论坛
强烈推荐StackExchange旗下的Mathematica子站,这里是一篇介绍此网站的帖子。
===一些注意事项===
A. 了解一下核心语言十分有必要
无论你使用Mathematica的目的是什么,都强烈建议你学习一下Mathematica的编程语言。有的人可能会出我只是接两个方程画画图像还有必要学习核心语言吗?我以前的看法是不需要学习的,但是问题是就算你只解方程和画图像,你仍然需要用做类似于“编程”的事,即使你自己可能不觉得你需要的是编程。如果你对“模式”、“表达式”、“替换规则”这些一窍不通的话,干任何稍微复杂一点的事,都可能寸步难行,到网上求助,别人给的代码你也可能看不懂。所以我现在觉得就算你从来不需要编程,学点核心语言也是不会错的。
B. 和其他语言的区别
学习的过程中一定要意识到Mathematica和其他软件(matlab等)和语言(C、Fortran)之间的区别还是比较大的,所以:
*****除非完全清楚自己在做什么,千万不要一股脑地将其他编程语言的概念、经验套用在Mathematica上。********
C. 唯手熟尔
勤查帮助,多多实践,越过陡峭的入门阶段之后就是另一番天地!
贴二、见键接,有道云笔记
有道云笔记note.youdao.com/share/?id=abd51087f44c0b6a41ff6022d549dc41&type=note#/
贴三、维基教科书中文版
Mathematica - Wikibookszh.wikibooks.org/zh-cn/Mathematica
四:mathematic资料参考中心
Core Language-Wolfram Language Documentationreference.wolfram.com/language/tutorial/CoreLanguageOverview.html
五、两个趣味的游戏的mathematica代码
1、五子棋
DynamicModule[{board, winner, p, pmouse, ppossible, v, Reset},
Reset[] := {winner, board} = {"", ConstantArray[0, {20, 20}]};
Reset[];
Deploy@Graphics[
Button[{Brown, Rectangle[{0, 0}, {20, 20}], Black,
Line[Join @@
Table[{{{i, 0}, {i, 20}}, {{0, i}, {20, i}}}, {i, .5, 19.5}]],
Dynamic[pmouse =
Ceiling@MousePosition["Graphics", {-1, -1}] /. {0 -> 1,
21 -> 20};
If[1 <= Min@pmouse <= Max@pmouse <= 20 &&
winner == "", {Opacity@.3, Disk[pmouse - .5, .4]}, {}]],
Dynamic[Disk[# - .5, .4] & /@ Position[board, 1]], White,
Dynamic[Disk[# - .5, .4] & /@ Position[board, -1]], Red,
Text[Style[Dynamic@winner, 60], {10, 10}]},
If[winner != "", Reset[], p = pmouse;
If[Extract[board, p] == 0, board[[p[[1]], p[[2]]]] = 1;
FinishDynamic[];
If[Max[
Table[Total[
RotateRight[board, #*d] & /@
Range[0, 4]], {d, {{0, 1}, {1, 0}, {1, 1}, {1, -1}}}]] ==
5, winner = "You win!", ppossible = Position[board, 0];
v = (9*^9 Count[#, {___, -1, -1, -1, -1, ___}] +
3*^8 Count[#, {___, 1, 1, 1, 1, ___}] +
1*^7 Count[#, {___, 0, -1, -1, -1, 0, ___}] +
5*^5 Count[#, {___, 0, 1, 1, 1, 0, ___}] +
3*^5 Count[#, {___, 0, -1, -1, -1, ___}] +
3*^5 Count[#, {___, -1, 0, -1, -1, ___}] +
3*^5 Count[#, {___, -1, -1, 0, -1, ___}] +
3*^5 Count[#, {___, -1, -1, -1, 0, ___}] +
2*^4 Count[#, {__, 0, -1, -1, 0, __}] +
2*^4 Count[#, {__, 0, -1, -1, 0, __}] +
2*^4 Count[#, {__, 0, 0, -1, -1, 0}] +
2*^4 Count[#, {0, -1, -1, 0, 0, __}] +
2*^4 Count[#, {___, 0, -1, 0, -1, 0, ___}] +
2*^3 Count[#, {___, 0, 1, 1, 1, ___}] +
2*^3 Count[#, {___, 1, 0, 1, 1, ___}] +
2*^3 Count[#, {___, 1, 1, 0, 1, ___}] +
2*^3 Count[#, {___, 1, 1, 1, 0, ___}] +
2*^3 Count[#, {__, 0, 1, 1, 0, __}] +
2*^3 Count[#, {__, 0, 1, 1, 0, __}] +
2*^3 Count[#, {__, 0, 0, 1, 1, 0}] +
2*^3 Count[#, {0, 1, 1, 0, 0, __}] +
2*^3 Count[#, {___, 0, 1, 0, 1, 0, ___}] +
100 Count[#, {_, __, 0, -1, 0, __, _}] +
100 Count[#, {__, 0, 0, -1, 0, _}] +
100 Count[#, {_, 0, -1, 0, 0, __}] +
50 Count[#, {_, __, 0, 1, 0, __, _}] +
50 Count[#, {__, 0, 0, 1, 0, _}] +
50 Count[#, {_, 0, 1, 0, 0, __}]) & /@ (Table[
Extract[board,
Mod[# + n*d, 20,
1]], {d, {{0, 1}, {1, 0}, {1, 1}, {1, -1}}}, {n,
Delete[Range[-4, 4], 5]}] & /@ ppossible);
p = RandomChoice@Extract[ppossible, Position[v, Max@v]];
board[[p[[1]], p[[2]]]] = -1;
If[
Min[Table[
Total[RotateRight[board, #*d] & /@
Range[0, 4]], {d, {{0, 1}, {1, 0}, {1,
1}, {1, -1}}}]] == -5, winner = "You lost!"]]]]],
Background -> Lighter[Brown, .1], ImageSize -> 419]]
2、黑白棋(老版本的mma写的,mma11可能有点问题,但10.2肯定没问题)
CreateDialog[DynamicModule[{chessmat,set,drawchess,initialize,setable,setQmat,color,turn,rules1,rules2,type},initialize[]:=(chessmat=ArrayPad[{{1,-1},{-1,1}},{3,3}];setQmat=Normal@SparseArray[{{3,5},{4,6},{5,3},{6,4}}->True,{8,8}];color=1;);initialize[];drawchess[mat_]:=Join[{Black,Disk[#1-.5,.4]}&/@Position[chessmat,1],{White,Disk[#1-.5,.4]}&/@Position[chessmat,-1]];rules1[color_]:={pre___,color,a:-color..,X,after___}:>{pre,color,(Sequence@@-{a}),X,after};rules2[color_]:={pre___,X,a:-color..,color,after___}:>{pre,X,(Sequence@@-{a}),color,after};turn=Function[{list,color},list=list/.rules1[color]/.rules2[color],HoldFirst];setable[i_,j_,color_]:=Block[{mat},If[chessmat[[i,j]]!=0,Return[False]];mat=ReplacePart[chessmat,{i,j}->X];!VectorQ[{mat[[i]],mat[[All,j]],Diagonal[mat,-i+j],Diagonal[Reverse@mat,i+j-9]},FreeQ[#,{___,color,-color..,X,___}|{___,X,-color..,color,___}]&]];set[i_,j_]:=Block[{tmp,tmplist},If[setQmat[[i,j]],chessmat[[i,j]]=X;turn[chessmat[[i]],color];turn[chessmat[[All,j]],color];tmp=Min[i,j];tmplist=Diagonal[chessmat,-i+j]/.rules1[color]/.rules2[color];Do[chessmat[[k+i-tmp,k+j-tmp]]=tmplist[[k]],{k,1,Length@tmplist}];tmp=Min[i,9-j];tmplist=(Diagonal[Reverse@chessmat,i+j-9]/.rules1[color]/.rules2[color])//Reverse;Do[chessmat[[k+i-tmp,-k+j+tmp]]=tmplist[[k]],{k,1,Length@tmplist}];chessmat[[i,j]]=color;color*=-1;setQmat=Array[setable[##,color]&,{8,8}];If[FreeQ[setQmat,True],color*=-1;setQmat=Array[setable[##,color]&,{8,8}];If[FreeQ[setQmat,True],CreateDialog[{Style["游戏结束,"<>If[Total[chessmat,2]>0,"黑方胜","白方胜"],20,Bold],ChoiceButtons[{"再来一局","取消"},{initialize[];DialogReturn[],DialogReturn[]}]}],If[type[[1]]=="人机对弈"&&color==-1,set@@RandomChoice[Position[setQmat,True]]];]];];];Deploy@Row[{Graphics[{{RGBColor[0,.5,0],Rectangle[{0,0},{8,8}]},Table[With[{i=i,j=j},Button[{Opacity[0],Disk[{i,j}-.5,.4]},set[i,j];If[type[[1]]=="人机对弈"&&color==-1,set@@RandomChoice[Position[setQmat,True]]];]],{i,8},{j,8}],{Thick,Line[Table[{{i,0},{i,8}},{i,0,8}]]},{Thick,Line[Table[{{0,i},{8,i}},{i,0,8}]]},Dynamic@drawchess[chessmat],Dynamic@{Orange,PointSize[Large],Point[Position[setQmat,True]-0.5]},Dynamic@{If[color==1,Black,White],Opacity[.5],Disk[MousePosition[{"Graphics",Graphics},{-2,-2}],.4]},Table[Inset[Style[ToString@FromCharacterCode[i+64],20,Bold],{i-.5,-.5}],{i,8}],Table[Inset[Style[ToString@i,20,Bold],{-.5,i-.5}],{i,8}]},ImageSize->400,PlotRange->{{-1,8.5},{-1,8.5}}],Column[{Column[{Graphics[{Black,AbsolutePointSize[25],Point[{0,0}],Text[Dynamic@Style[Count[chessmat,1,2],25,Bold],{3,0}]},ImageSize->{120,40}],Graphics[{White,AbsolutePointSize[25],Point[{0,0}],Text[Dynamic@Style[Count[chessmat,-1,2],25,Bold],{3,0}]},ImageSize->{120,40}]},Alignment->Left],RadioButtonBar[Dynamic[type],Style[#,20,Bold]&/@{"双人对弈","人机对弈"},Appearance->"Vertical",BaselinePosition->Bottom],Button[Style["重新开始",20,Bold],initialize[]]},Spacings->6,Alignment->Center]}]],Background->Brown,WindowTitle->"黑白棋"];
注意,文中出现的#、/@、&、##等字符是高手写程序常用的,也是借鉴了其他编程语言的思想。在mathematica中有参考文档,分别是:Slot(#)(插符)、Function(&)(纯函数)、Map(/@)(映射)。相关符号也可见帮助:guide/FunctionalProgramming 。更多符号用法参见Wolfram语言语法:guide/Syntax。
用mathematica的主要还是理工科的人居多,尤其是物理、数学、天文、金融、地理、医学等等,当然也有其他很多专业都可以用。除了上面提到的那些帮助资料,最关键的还是自己在平时的学习。平时没事就自己尝试用mathematica解一些微分方程、做一些数值计算,自己用mathematica解决一些经典的问题(比如八皇后、Hanoi塔、闰年闰月等问题)。然后找一些其他的类似的别人写的程序比较一些,吸取经验。
做数值计算基本都会遇到循环,至于用哪个循环语句我就不多说了,自己看,我想强调的是注意立即赋值运算符和延迟赋值运算符。建议使用立即赋值运算符,否则你的程序将会很慢很慢很慢很慢很慢,为什么自己思考或查找。
记住:多练习,多比较,多思考。
虽然有点混乱,但我想还是有帮助的吧。