好像是说b这个被定义了。但是没定义啊
mathematica吧
全部回复
仅看楼主
level 1
求助,可能是哪里出问题了、
输入:
f1[b_] = GyromagneticRatio["1H"] (1 - δ₁ 10⁻⁶) b;
f2[b_] = GyromagneticRatio["1H"] (1 - δ₂ 10⁻⁶) b;
f3[b_] = GyromagneticRatio["1H"] (1 - δ₃ 10⁻⁶) b;
ave[b_] := (f1[b] + f2[b] + f3[b]) / 3.;
Ham0[b_] = (f1[b] - ave[b]) opI[1, "z"] + (f2[b] - ave[b]) opI[2, "z"] + (f3[b] - ave[b]) opI[3, "z"] + 2 π (J12 opI[1].opI[2] + J23 opI[1].opI[3]);
{ev1, vecs1} = CorrelatedEigensystems[Ham0[b] /. {J12 -> 25., J23 -> 5, δ₁ -> +0, δ₂ -> 10, δ₃ -> -10}, {b, 0.00, .25, 1/100}];
2026年03月18日 11点03分 1
level 1
2026年03月18日 11点03分 2
吧务
level 15
……这无疑是个糟糕的提问。啥?“我就随便问一下碰碰运气”?那行,我也随便答一下。
1. 你那代码是用大语言模型从图上OCR的是吧,错了。
2. 你这代码出自文献《Adiabatic Passage through Level Anticrossings in Systems of Chemically Inequivalent Protons Incorporating Parahydrogen: Theory, Experiment, and Prospective Applications》(doi.org/10.1021/jacs.2c09000)的补充材料——是,这年头这类问题用AI考证起来也不麻烦,但这不是你不在问题里写明这点的理由。
3. 问题答案的线索就在这份补充材料里。把某个地方改过来之后:
2026年03月18日 12点03分 3
感谢大佬的回复。初来贵地不了解规矩,也确实抱着随便问一下碰碰运气的心里。实在抱歉。不知道您是改了哪个地方,求教。后面我会删除不正规的帖子
2026年03月19日 06点03分
@圣德太子666 ……你可别删,否则我不白打这么多字了吗。
2026年03月19日 11点03分
吧务
level 15
既然LZ已经知错,那就详细说一下。这代码出不了结果有两个问题:
1. OCR出错,把Mathematica代码里的上下标分别认成了Unicode里的上下标——下标倒还好,毕竟形如δ₂的变量也是合法的,但是形如10⁻⁶的东西是不会被识别成指数的。
2. LZ所用的SpinDynamica version SDv3.10.2源代码里含了一个非常低级的错误,把CorrelatedEigensystems函数给搞崩了。
第一条应该很明显,这里就不多解释了——如果真不明白的话,还请花点时间学一下Mathematica基础,另可参看精品区《有的字母蓝,有的字母黑,你知道为什么吗?你对语法着色有认识吗》,这里重点说一下我是怎么注意到第2条的。上一层楼里也说了,我在论文的补充材料里发现了线索,这个线索就是:
The “CorrelatedEigensystems” function in the SpinDynamica package version 3.60 running in Wolfram’s Mathematica version 12.0 was used…
要知道论文里的代码给不出预期的结果无外乎两种可能:
1. 作者贴错了代码。
2. 兼容性问题。
既然论文已经明确说了文中的图用的是3.60版的SpinDynamica,那么显然我们应该测试一下。(虽然3.60版的官网下载链已经废了,但是至少可以测试一下相对比较旧的版本。)结果,3.7.1版还真能用,也就是说版本3.10.2出现了bug/兼容性问题。
好了问题解决了,改用旧版程序包吧——这个就是我昨天写3楼的回复时准备的答案,但是呢,我昨天偏偏吃的比较饱,回完帖之后又试了一会儿,结果把3.10.2版的问题所在给找到了。这里的重点是使用Mathematica自带的调试器。勾选在警告信息处暂停后检查堆栈(如果不明白这句在说什么,请参看精品区《【教程】Mathematica自带调试器的使用》),会发现CorrelatedEigensystems::parAssigned警告之所以会冒出来,是因为CorrelatedEigensystems调用了一个UnassignedSymbols函数去试别变量,而稍加尝试,会发现这个函数在3.10.2版似乎总是无输出,那么显然我们应该检查一下UnassignedSymbols的源代码。打开General文件夹下的Miscellaneous.m文件,找到相应的函数定义——幸而这个函数并不复杂,它的古怪行为也给了我们提示——我们立刻就会发现:
多了个分号嗯。
也就是说,想让代码正常出图只需:
1. 把OCR的低级错误改过来。
2. 把General文件夹下的Miscellaneous.m文件里UnassignedSymbols函数定义中Complement[…]末尾多余的分号去掉。
2026年03月19日 12点03分 4
试别变量 -> 识别变量
2026年03月19日 12点03分
level 1
感谢大神[真棒]我好好学习下内容,有点丰富我好好消化下
2026年03月20日 00点03分 5
level 1
感谢感谢。已成功模拟[真棒]
2026年03月20日 02点03分 6
1