日月为易,刚柔相推。是故易有太极,是生两仪,两仪生四象,四象生八卦,八卦定吉凶,吉凶生大业。是故法象莫大乎天地,变通莫大乎四时,悬象著明莫大乎日月。本文目的一半是对《易经》卜卦知识的总结,另一半是对利用编程解决实际问题能力的锻炼。至于卜卦,玩玩而已,但是对于《易经》,里面有很多知识值得我们学习。
三枚铜钱,作为钱筮用具。在焚香致敬祝祷命筮之后,将三枚钱币握于手中,左手在上象征“天”,右手在下象征“地”;随意在手中晃动,再抛掷于地,看三枚钱币的正反情况,确定卦爻的属性。一个背,两个字,称作“单”.画作“—”为少阳。
两个背,一个字,称作“拆”,画作“--”为少阴。
三个背,没有字,称作“重”,画作“O”为老阳,为阳爻,是变爻,主过去之事。
三个字,没有背,称作“交”,画作“X”为老阴,为阴爻,是变爻,主未来之事。
共摇六次,第一次为初爻,画在卦的最下面,依次上升,第六次为第六爻,画在卦的最上边。如遇有X、O,再画出变卦来(由于能力以及对《易经》的了解有限,未能解决变卦的问题(多爻变动如何选择),即本文只考虑给出原始的本卦)。
卜卦程序:三枚铜钱,共摇六次,依次输入字面朝上的次数。第一步:先计算每次字面朝上次数所对应的阴阳爻(即二进制的零一表示)
function[yy]=yao(n)%分析每爻的变化,输入铜钱摇得的字面数%输出:yy表示阴阳爻,0为阴,1为阳ifn<0||n>3error('Thenumyourinputiserror,pleaseinputagain');endswitchncase0%三背为重,老阳,阳爻,是变爻,主过去之事yy=1;case1%一字为拆,少阴yy=0;case2%两字为单,少阳yy=1;otherwise%三字为交,老阴,阴爻,是变爻,主未来之事yy=0;endend第二步:由每三次摇得的阴阳爻,分别得出单卦
function[gua]=gua(n1,n2,n3)%由三爻得一卦,输入每爻的阴阳%输出八卦(后天八卦):乾一、兑二、离三、震四、巽五、坎六、艮七、坤八%阳爻时n为1,阴爻时n为0gua=1+(~n3)+(~n2)*2+(~n1)*4;end第三步:由两个单卦组合,得出本卦
functionname=duan_gua(in,out)%由起卦所得内外卦,输出全卦%乾一、兑二、离三、震四、巽五、坎六、艮七、坤八ifin<0||in>8||out<0||out>8disp('Thenumiserror,pleasecheckit');exit;endgua_list={'乾为天','天泽履','天火同人','天雷无妄','天风姤','天水讼','天山遁','天地否';'泽天夬','兑为泽','泽火革','泽雷随','泽风大过','泽水困','泽山咸','泽地萃';'火天大有','火泽睽','离为火','火雷噬嗑','火风鼎','火水未济','火山旅','火地晋';'雷天大壮','雷泽归妹','雷火丰','震为雷','雷风恒','雷水解','雷山小过','雷地豫';'风天小畜','风泽中孚','风火家人','风雷益','巽为风','风水涣','风山渐','风地观';'水天需','水泽节','水火既济','水雷屯','水风井','坎为水','水山蹇','水地比';'山天大畜','山泽损','山火贲','山雷颐','山风蛊','山水蒙','艮为山','山地剥';'地天泰','地泽临','地火明夷','地雷复','地风升','地水师','地山谦','坤为地';};name=gua_list(in,out);end主程序:输入六次摇得的铜钱字面朝上数,依次调用各子函数,已经与GUI程序整合
%三钱筮法MATLAB实现%起卦:三枚铜钱,共摇六次,依次输入字面朝上的次数。functionguaci=SuanGua(number)c1=yao(number(1));c2=yao(number(2));c3=yao(number(3));c4=yao(number(4));c5=yao(number(5));c6=yao(number(6));guaci=duan_gua(gua(c1,c2,c3),gua(c4,c5,c6));GUI界面设计图形界面设计使用操作流:在MATLAB的命令窗口中输入guide命令,打开guidequickstart窗口,选择createnewgui点ok,生成新的fig文件,然后再在窗口中进行各项操作。有几点注意事项:(1)图片的插入代码段:
有兴趣的朋友如果想试试,可以将上面的三个函数和下面的GUI程序保存为m文件,并且将下图中的八卦logo截图保存为taiji.jpg(调整宽度:258,高度244);将这五个文件保存在一个文件夹中,运行GUI程序即可;在红色输入框中依次输入六个数字(1~3,否则报错),点击‘开始断卦’,即可出现如下效果:
以下代码是在GUI设计窗口操作之后,matlab自动生成的,修改部分代码实现功能。为了保证程序的可读性,并未删除自动生成的大量注释和空行。