如果您要为从头开始的世界(我从您的 MP2 方程中猜测)编写此内容,您希望使其非常容易且清晰地表达尽可能接近数学定义的事物。
一方面,我不会有复杂的range
功能。让它定义一个循环,但如果您想要嵌套循环,请同时指定它们:
所以而不是
(range(i) < j < N)[T(i,j) = (T(i,j) - T(j,i))/e(i+j)];
use
loop(j,0,N)[loop(i,0,j)[T(i,j) = (T(i,j) - T(j,i))/e(i+j)]]
对于像 sum 和 Product 这样的东西,让语法“继承”它是一个循环的事实。
所以而不是
sum(range(i) < j < N))[(T(i,j) - T(j,i))/e(i+j)];
use
sum(j,0,n)[loop(i,0,j)[(T(i,j) - T(j,i))/e(i+j)]]
或者如果您需要双倍金额
sum(j,0,n)[sum(i,0,j)[(T(i,j) - T(j,i))/e(i+j)]]
由于看起来您正在尝试表示量子力学运算符,因此请尝试使您的语言结构尽可能与运算符在 1-1 的基础上匹配。这样就很容易翻译(并且清楚正在翻译的内容)。
编辑添加
既然你正在研究量子化学,那么它就相当简单(至少就语法而言)。您定义的运算符始终处理其右侧的内容,然后您唯一需要的其他东西是括号来对运算符停止的位置进行分组。
爱因斯坦表示法很有趣,您无需指定索引或界限,并且由于约定而隐含它们,但这并不能形成清晰的代码,而且更难以思考。
对于总和,即使隐含了界限,它们也总是很容易根据上下文计算出来,因此您应该始终让人们指定它们。
总和(i,0,n)总和(j,0,i)总和(a,-j,j)总和(b,-i,i)......
由于每个运算符都向右工作,因此其变量是已知的,因此 j 可以知道 i,a 可以知道 i 和 j,b 可以知道 i、j 和 a。
根据我与量子化学家的经验(我也是其中之一!),他们不喜欢与他们编写的内容有很大差异的复杂语法。他们很乐意将双倍和三倍和以及积分分成单数集合,因为无论如何这些都只是简写。
对称性也不会那么难。它只是交换和加法或乘法的集合。我会做一些指定操作的操作,其中包含相同且可以交换的元素列表:
c2v(sigma_x,a,b)a+b
这说明在 c2v 操作下 a 和 b 可以被认为是相同的粒子。这意味着任何带有 a 和 b 的方程(例如后面的 a+b)都应该转换为 c2v 变换的线性组合。 sigma_x 是您想要应用于函数 (a+b) 的 c2v 中的运算。如果我没记错的话,那就是 1/sqrt(2)((a+b)+(b+a))。但我这里没有对称性书,所以这可能是错误的。