假设我想构建一个矩阵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,我该怎么办?那样做?
答案 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}]
检查出来(无需定义f
,d
,u
,l
):
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}]
您可以在不定义f
或d
的情况下查看:
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]
,这是一个有效的表达式,但通常被认为是无意义的。