错误的Wolfram Mathematica代码翻译

时间:2014-05-25 14:34:36

标签: c++ qt wolfram-mathematica linear-algebra

我是 Mathematica 的新手。我需要动态创建2d数组。我在C ++(Qt)中得到了一些代码,它看起来像这样:

void Wave::getMatrix(int M, int N)
{
    int k = -N;
    while(k < N+1){
        QVector<tsk_type> temp_vec;

        for(int i = -N; i < N+1; i++){
            tsk_type temp_sum0;

            for(int ii = -M; ii < M+1; ii++ ){
                temp_sum0 += (getI(i-ii, b)/getY(ii)) * getJ(ii-k,b1,b2);
                        }
            temp_vec[temp_vec.size()-1] = temp_sum0;

            if (k == i)
                temp_vec[temp_vec.size()-1] -= l;

                }

        temp_vec.push_back(getD(S)*getI(S-k, b));
        main_array.push_back(temp_vec);
        k++;
    }

}

/ 在 Mathematica 中,我已经编写了我需要的所有函数来制作一些我能解决的线性方程组矩阵。所以我使用&#39; em来列出&#39; &#39;列出&#39;。

当我运行此代码时,它就像执行某些操作但不输出任何内容。甚至没有错误。 怎么了?我应该如何正确翻译呢?另外,我认为&#39; List []&#39;有问题。和&#39;列表[[]]&#39;变量,那么我如何正确地声明动态列表?

这是公式

enter image description here

这是我如何翻译代码。

(*all globlas definiton is somewhere here*)

 k = -Nm;

        mainmatrix = List[[]];
        While[k < Nm + 1,
                    rowvalues = List[];
                    For[i = -Nm, i < Nm + 1, i++,

                           tempsum;



                           For[j = -M, j < M + 1, j++,    
                                      tempsum = tempsum +  (getI[i - j, a, b]/getGamma[j])                  * getJ[j - k, a1, b1, a2, b]
                           ]

                           AppendTo[rowvalues, tempsum];    

                           If[k == i, AppendTo[rowvalues, -l], 0]
                       ];


                       AppendTo[rowvalues, getD[S]*getI[S - k, a, b]];
                   AppendTo[mainmatrix, rowvalues];

         k++]

UPD : 所有功能和数据

Clear[k, a, b, a1, b1, a2, b2, angle, rho, omega, lambda, u];
(*constants*)  
rho = 1800; angle = 0.5; lambda = 3 * 10^9; omega = 1.5 * 10^6; u = 
 2*10^9;
BS = 1; DS = 1; T = 0.01; l = 0.01; S = 0;
a = 0.002; b = 0.008; a1 = 0.0; b1 = 0.002; a2 = 0.008; b2 = 1.0; M = 
7; Nm = 7;

getI[k_ , a_, b_] = Integrate[E^(I ((2 Pi)/l) k t), {t, a, b}]

getJ[k_ , a1_, b1_, a2_, b2_] = getI[k, a1, b1] + getI[k, a2, b2]

getL[n_] = angle + (2 Pi n/l); 

getK[j_] = If[j == 1, 
  answer = Sqrt[(rho*omega^2)/(lambda + 2*u)], 
  answer = Sqrt[(rho*omega^2)/(u)]
  ]; answer


getBeta[j_, n_] = If[(getL[n] > getK[j]), 
  beta = 0 + i*(getL[n]* getL[n]  * getK[j]*getK[j]),
  beta =  (getL[n]* getL[n]  * getK[j]*getK[j]) + i*0]; beta


getGamma[n_] = (((getL[n]*getL[n])/(getBeta[1, n])) + getBeta[2, n]);

getD[s_] = ((2 getL[s] * BS * getBeta[1, s] + DS) / (getL[s] * getL[s] 
            + getBeta[1, s]*getBeta[2, s] ));

2 个答案:

答案 0 :(得分:1)

我不知道这一切是否完全正确,但它更接近。

In[1]:= n = 2; M = 2; (*dummy values for this example code*)
getGamma[i_] := RandomReal[]; (* dummy functions for this example code*)
getI[i_, a_, b_] := RandomReal[];
getJ[j_, a1_, b1_, a2_, b_] := RandomReal[];
getD[S_] := RandomReal[];

k = -n;(*N is a predefined Mathematica function and can't be a variable name*)
mainmatrix = List[];
While[k < n+1,
  rowvalues = List[];
  For[i = -n, i < n+1, i++,
   AppendTo[rowvalues, getGamma[i]];
   tempsum = 0; (*I think you wanted this initialized here*)
   For[j = -M, j < M+1, j++, 
    tempsum += getI[i-j, a, b]/getGamma[j]*getJ[j-k, a1, b1, a2, b]
   ];
   AppendTo[rowvalues, tempsum];
   If[k == i, AppendTo[rowvalues, -l]] (*no "else" needed if else does nothing*)
  ];
  AppendTo[rowvalues, getD[S]*getI[S-k, a, b]];
  AppendTo[mainmatrix, rowvalues];
  k++
];
mainmatrix (*display result*)

Out[8]= {{0.135926, 0.894736, -l, 0.699663, 1.91913, 0.702762, 
  28.4151, 0.730135, 19.6996, 0.583233, 21.2716, 0.398302},
{0.572982, 3.18868, 0.495877, 1.50816, -l, 0.686158,
  68.9278, 0.860748, 3.91516, 0.751198, 8.43028, 0.223722},
{0.931385, 3.16432, 0.931398, 5.10999, 0.241402, 4.54042,
  -l, 0.825971, 2.99634, 0.280342, 3.20253, 0.0731139},
{0.294396, 7.99678, 0.456691, 4.74995, 0.308643, 1.72647,
  0.883139, 5.64323, -l, 0.755833, 4.00285, 0.127718},
{0.790168, 0.751702, 0.744966, 2.40172, 0.537242, 3.08838,
  0.105972, 1.09212, 0.412047, 12.2475, -l, 0.397379}}

当使用矩阵结果时,实现所有Mathematica矩阵和向量下标都是1..n,而不是0..n-1而不是-n..n。因此,在修改代码以使用生成的矩阵时,您必须为任何矩阵下标添加偏移量。

如果对你很重要,你可以替换

tempsum = 0;(*I think you wanted this initialized here*)
For[j = -M, j < M + 1, j++, 
  tempsum += getI[i - j, a, b]/getGamma[j]*getJ[j - k, a1, b1, a2, b]];
AppendTo[rowvalues, tempsum];

AppendTo[rowvalues,Sum[getI[i-j,a,b]/getGamma[j]*getJ[j-k,a1,b1,a2,b],{j,-M,M}]];
例如,这可能避免了未初始化tempsum的原始错误。

代码的其他部分可以重写以利用Mathematica功能,但你必须决定这是好事还是坏事。

答案 1 :(得分:1)

这里你没有AppendTo

的所有讨厌的使用
 mainmatrix = Table[ 
               Insert[
                Append[
                 Flatten@Table[ {
                  getGamma[i],
                  Sum[getI[i - j, a, b]/getGamma[j]  getJ[j - k, a1, b1, a2, b],
                                  {j, -M, M}] },
                                    {i, -n, n}]  ,
                   getD[S]*getI[S - k, a, b]],
                          -l,2 (k + n + 1) + 1 ], 
                                        {k, -n, n}];

编辑:

在进一步研究中,似乎C ++代码实际上抛弃了它推入temp_vec的getY(i)值,结果更简单:

 mainmatrix = Table[ 
       Append[
          Table[ Sum[getI[i - j, a, b]/
                getGamma[j]  getJ[j - k, a1, b1, a2, b]-l Boole[i == k],
                         {j, -M, M}] , {i, -n, n}]  ,
          getD[S]*getI[S - k, a, b]], {k, -n, n}];

另一种形式,实际上开始类似于你的方程式。

 lhs = Table[Sum[getI[i - j, a, b]/
    getGamma[j] getJ[j - k, a1, b1, a2, b], {j, -M, M}],
           {k, -n, n}, {i, -n, n}] - l IdentityMatrix[2 n + 1];
 rhs = Table[ getD[S]*getI[S - k, a, b] , {k, -n, n}];
 mainmatrix= Join[lhs, Transpose[{rhs}], 2]