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

Matrix 在Mathematica中构造三对角矩阵,其中非零元素包含函数和变量,matrix,wolfram-mathematica,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]]在x和y上进行积分,两者都从0到1,我该怎么做呢?波段是专门为此而定制的: In[1]:= n = 4; f[x_, y_] := x^2 + y^2; A = Normal[SparseArray[{ {i_,i_}/

假设我想要构造一个矩阵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]]在x和y上进行积分,两者都从0到1,我该怎么做呢?

波段是专门为此而定制的:

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]}}
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}]
检查它无需定义f、d、u、l:

请注意,MatrixForm不应是定义的一部分。例如,设置a=something//MatrixForm是个坏主意。您将得到一个MatrixForm对象,而不是table=array of array或稀疏数组,它的唯一用途是在前端漂亮地打印出来。在计算中尝试使用矩阵变换会产生错误,并会导致不必要的混乱

在{1,1}处集成元素:

您也可以在不定义f或d的情况下检查它:

myTridiagonalMatrixWithFirstDiagonalElementIntegrated@5
然而,后者的行动看起来可疑。例如,它不会使矩阵或其相应的线性系统保持不变w.r.t.合理变换。此操作甚至不能保持矩阵的线性。你可能不想这么做


对上面评论的评论:不需要定义[x,y]:=…来集成[A[[1,1]],{x,0,1},{y,0,1}]。请注意,A[[1,1]]与A[1,1]完全不同:前者是[A,1,1]的一部分,是表A的某个元素。A[1,1]是一个不同的表达式:如果A是某个表,那么A[1,1]就是该表[1,1],它是一个有效的表达式,但通常被认为是无意义的。

谢谢。我想,这很好用。但是,如何进行集成?难道不需要有参数x和y吗?除非我误解了这个问题,它做了积分,在矩阵的左上角是结果,2/3+d[I]oops,应该是2/3+d[1],现在编辑并更正了。我不明白为什么你认为A需要参数,它只是一个矩阵。您可以使用[[2,3]]提取元素,但这是我猜您可能在想的唯一一件事。如果你的意思不止这些,那么你需要解释你在想什么。Mathematica不是一种普通的编程语言,如果这是你的背景和出身的话。很多事情都不一样。对不起,我可能错过了上次的整合或者它不在那里。假设我构造一次矩阵,然后在某个时间点,我想进行积分。为此,我是否应该定义一个as函数:LHS上的[x,y],然后积分[A[[1,1]],{x,0,1},{y,0,1}]?如果我听起来还不太清楚,请告诉我。顺便说一句,正常人做什么?我对每个新问题都有点困惑。矩阵不是函数,它只是一个存储值的地方。您可以稍后为元素指定一个新值,比如[[1,1]]=Integrate[stuff],但我开始认为您的困惑可能比我想象的要深。正常人会做一些不同的事情,这取决于你给它什么。在本例中,Normal将SparseArray转换为普通矩阵。阅读有关普通和SparseArray的文档。阅读文档页面时,请始终单击“详细信息”。对不起,我同意,我应该检查文档。然而,我强烈怀疑你误解了我。我们暂时不要做积分。我试图在你的第一个回复后构建矩阵,该回复现在被修改了,但不能正确生成。n=4;f[x,y]:=x^2+y^2;对于[i=1,il[i-1]},{n,n}]///MatrixForm
myTridiagonalMatrixWithFirstDiagonalElementIntegrated@n_Integer?Positive := 
MapAt[
  Integrate[#, {x, 0, 1}, {y, 0, 1}]&
, myTridiagonalMatrix@n
, {1, 1}]
myTridiagonalMatrixWithFirstDiagonalElementIntegrated@5