mathematica 记录本



昨天画了几个朗道能级图,发现增加应力和无应力时几乎的能级分裂几乎相同,从头到尾检查了公式,代码,发现没有错误,所以为应力的效应不大。今天试着给出解析式时,发现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[Eigenvalues@(hLanZeeStr[#])] & /@ klis
  
  ]

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

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




你可能感兴趣的:(mathematica 记录本)