【问题标题】:Octave minimization for a many-body Hamiltonian with non-linear constraint具有非线性约束的多体哈密顿量的八度最小化
【发布时间】:2021-01-27 11:33:15
【问题描述】:

我从事理论物理学工作,遇到了一个问题,该问题需要最小化一个具有 8 个粒子的系统的特定哈密顿算子,并具有一个非线性约束。由于系统的复杂性,我无法“一次性”定义整个哈密顿量,也无法定义约束。我的意思是我要搜索的量是反复定义的,取决于对 7 个粒子系统计算的量的复杂总和,而这又取决于为 6 个系统计算的量,依此类推,直到它达到一个或双粒子系统,其中所述量作为初始值给出,取决于列向量的元素(参数/最小化参数)。约束本身也是这种形式,要求 8 个粒子的状态之间的“重叠”恰好为 1。(即状态被归一化)我一直在考虑一种使用 fmincon 的方法,但我来了简而言之,因为我的函数隐含地依赖于参数,我不能明确地写出整个事情。为了更好地理解,这里是一些代码:

for m=3:npairs+1
  for n=3:npairs+1
    for i=1:nsps
      for j=1:nsps
        overlap(m,n)=overlap(m,n)+x(i)*x(j)*(delta(i,j)*(overlap(m-1,n-1)-N(m-1,n-1,i))+p0p(m-1,n-1,j,i));
        p(m,n,i)=(n-1)*x(i)*overlap(m,n-1)-(n-2)*(n-1)*x(i)*x(i)*((m-1)*x(i)*overlap(m-1,n-1)-(m-2)*(m-1)*x(i)*x(i)*p(m-1,n-1,i));
        N(m,n,i)=2*(n-1)*x(i)*p(n-1,m,i);
        p0p(m,n,i,j)=(m-1)*(n-1)*x(i)*x(j)*overlap(m-1,n-1)-(m-1)*(n-1)*(m-2)*x(i)*x(i)*x(j)*p(m-2,n-1,i)-(m-1)*(n-1)*(n-2)*x(i)*x(j)*x(j)*p0(m-1,n-2,j)-(m-1)*(n-1)*(m-2)*(n-2)*x(i)*x(i)*x(j)*x(j)*(delta(i,j)*(overlap(m-2,n-2)-N(m-2,n-2,i))+p0p(m-2,n-2,j,i));
      endfor
    endfor
  endfor
endfor

function [E]=H(x)
    E=summation over all i and j of N and p0p for m=n=8 %not actual code


endfunction
overlap(9,9)=1 %constraint

【问题讨论】:

  • 因为这是 Octave 而不是 MATLAB,所以该标签更合适。这里的症结似乎也在于数学;你试图用文字来定义问题,但用方程和函数来定义它会使代码的翻译变得更简单。如果没有关于这段代码试图做什么的上下文,没有关于变量是什么的任何内联 cmets,或者关于为什么这段代码没有实现的任何信息,“这里是一些代码”并没有提供太多帮助你要什么。
  • @Wolfie 我也使用了 Octave 标签,但鉴于这是我的第一个问题并且语法几乎相同,我认为如果问题同时被标记,我将有更多机会得到答案。如果这引起了任何误解,我深表歉意,并且将来会更加小心。定义整个问题以及所述方程中每个术语的实际含义需要相当多的量子核理论知识,而且我对让某人修复已经为我编写的部分不感兴趣,因为我知道它们是正确的。我只是想用约束来最小化函数
  • 如果问题需要量子核理论背景,那么公共问答网站可能不是您所需要的。底线是您正在尝试实现一些数学运算,并且没有提供方程式,这使得它更加主观(仅基于您的描述)并且更难回答。如果您认为背景超出了我们的范围,那么您需要简化问题;为了minimal reproducible example,一个8层递归可以变成一个2层递归,一个大系统可以变成一个小系统,这也有助于你自己理解你的问题。

标签: optimization octave physics nonlinear-optimization


【解决方案1】:

很难给出一个具体的答案,但我建议您从以下几点开始。

首先,请注意,嵌套循环的内部两个步骤可以向量化,因为 i 和 j 始终显示为索引(而 m 和 n 进行反向引用,因此它们不能向量化)。因此,您的 4 级循环可以简化为包含 4 个函数在 i-by-j 矩阵上运行的 2 级循环。

其次,请注意,整个构造可以表示为递归函数。如果您有适合 m = 0, n = 0 的基本情况,则可以迭代地获得所有情况下的所有 i,j 矩阵,直到 m=9,n=9。特别是,您可以尝试“记忆”早期的步骤,并将它们插入更高的步骤,而不是依赖实际的递归。

【讨论】:

    【解决方案2】:

    假设您需要将前两个索引固定为 8(如果我理解正确的话),您可以轻松地使用 Anonymous Functions
    https://octave.org/doc/v6.1.0/Anonymous-Functions.html#Anonymous-Functions

    # creating same data
    A=ones(8,8,4,4);
    B=2*ones(8,8,4,4);
    
    # defining 2 versions of sums
    f = @(A,B) [sum(sum(A(8,8,:,:))), sum(sum(B(8,8,:,:)))];
    g = @(A,B) sum(sum(A(8,8,:,:)))+ sum(sum(B(8,8,:,:)));
    
    E1=f(A,B)
    E2=g(A,B)
    

    输出将是:

    octave:21> E1=f(A,B)
    E1 =
    
       16   32
    
    octave:22> E2=g(A,B)
    E2 =  48
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      相关资源
      最近更新 更多