在Mathematica中构造一个三对角矩阵,其中非零元素包含函数和变量

时间:2014-07-07 12:29:51

标签: matrix wolfram-mathematica

假设我想构建一个矩阵A,使A[[i,i]]=f[x_,y_]+d[i]A[[i,i+1]]=u[i]A[[i+1,i]]=l[i], i=1,N。说,f[x_,y_]=x^2+y^2

我如何在Mathematica中编码?

此外,如果我想整合A的第一个对角线元素,即A[[1,1]]超过xy,两者都从0运行到1,我该怎么办?那样做?

2 个答案:

答案 0 :(得分:0)

In[1]:= n = 4;
f[x_, y_] := x^2 + y^2;
A = Normal[SparseArray[{
  {i_,i_}/;i>1 -> f[x,y]+ d[i],
  {i_,j_}/;j-i==1 -> u[i],
  {i_,j_}/;i-j==1 -> l[i-1],
  {1, 1} -> Integrate[f[x,y]+d[1], {x,0,1}, {y,0,1}]},
  {n, n}]]

Out[3]= {{2/3+d[1], l[1],          0,            0},
        {u[1],      x^2+y^2+ d[2], l[2],         0},
        {0,         u[2],          x^2+y^2+d[3], l[3]},
        {0,         0,             u[3],         x^2+y^2+d[4]}}

答案 1 :(得分:0)

Band专为此而量身定制:

myTridiagonalMatrix@n_Integer?Positive := 
SparseArray[
  { Band@{1, 1} -> f[x, y] + Array[d, n]
  , Band@{1, 2} -> Array[u, n - 1]
  , Band@{2, 1} -> Array[l, n - 1]}
, {n, n}]

检查出来(无需定义fdul):

myTridiagonalMatrix@5 // MatrixForm

请注意,MatrixForm不应该是定义的一部分。例如,设置A = (something) // MatrixForm是个坏主意。您将获得一个MatrixForm对象而不是一个表(=数组数组)或一个稀疏数组,它的唯一目的是在FrontEnd中进行漂亮打印。尝试在计算中使用MatrixForm会产生错误,并会导致不必要的混淆。

将元素整合到{1, 1}

myTridiagonalMatrixWithFirstDiagonalElementIntegrated@n_Integer?Positive := 
MapAt[
  Integrate[#, {x, 0, 1}, {y, 0, 1}]&
, myTridiagonalMatrix@n
, {1, 1}]

您可以在不定义fd的情况下查看:

myTridiagonalMatrixWithFirstDiagonalElementIntegrated@5

然而,后一种行动看起来很可疑。例如,它不会使您的矩阵(或其相应的线性系统)保持不变w.r.t.合理的转变。 (此操作甚至不保留矩阵的线性。)您可能不想这样做。

评论上述评论:无需将A[x_, y_] := …定义为Integrate[A[[1,1]], {x,0,1}, {y,0,1}]。请注意,A[[1,1]]A[1, 1]完全不同:前者是Part[A, 1, 1],它是表A的特定元素。 A[1, 1]是一个不同的表达式:如果A是某个表,那么A[1, 1](that table)[1, 1],这是一个有效的表达式,但通常被认为是无意义的。