欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mathematica 记录本

程序员文章站 2022-03-31 12:24:45
...



昨天画了几个朗道能级图,发现增加应力和无应力时几乎的能级分裂几乎相同,从头到尾检查了公式,代码,发现没有错误,所以为应力的效应不大。今天试着给出解析式时,发现mathematica算出来的肯定不对。debug了一个多小时,终于发现了错误的源头,这估计很多时候会经常犯的错误,故记录于此,以防以后再犯。

er=0.1;
hLanZeeStr[kz_]:=
  Block[{},{{er+kz,0,0},{0,er-kz,0},{0,0,er}}
  ]

phLanZeeStr[kin_, kfi_] := 
 Block[{klis, ls, nu = 1000, ee, dd, lab,er=10^-10},
  klis = Table[i/nu (kfi - kin) + kin, {i, 0, nu}];
  ee = Sort[[email protected](hLanZeeStr[#])] & /@ klis
  
  ]

上面的代码,出现了全局和,Block环境里都有er这个变量。本来的取值是er=0.1,但是在phLanZeeStr这个函数里er本来用来做误差分析error的小量,碰巧重叠了,所以在这个block里,虽然没有明显的er变量,但是调用的函数hLanZeeStr里,由于其是延迟定义,故er将被赋值为error小量,造成了很大的误差。

所以 block使用时,一定要谨慎定义的变量。




转载于:https://my.oschina.net/u/1991972/blog/515522