我希望以前没有问过,如果是的话,我道歉。
编辑:为清楚起见,将使用以下表示法:矩形用于矩阵的粗体,粗体用于向量的小写,以及用于标量的斜体。
假设 x0 是向量, A 且 B 是矩阵函数, f 是向量函数
我正在寻找在Mathematica中执行以下迭代方案的最佳方法:
A0 = A(x0), B0=B(x0), f0 = f(x0)
x1 = Inverse(A0)(B0.x0 + f0)
A1 = A(x1), B1=B(x1), f1 = f(x1)
x2 = Inverse(A1)(B1.x1 + f1)
...
我知道for-loop
可以做到这一点,但我对Mathematica并不熟悉,我担心这是最有效的方法。这是一个合理的担忧,因为我想定义一个函数u(N):=xN
并在进一步的计算中使用它。
我想我的问题是:
对该计划进行编程的最有效方法是什么?
RecurrenceTable
是一种方法吗?
修改
这比我想要的要复杂一点。我提供了更多详细信息,以便获得更全面的回复。
在重复之前,我在理解如何编程功能 A , B 和 f 时遇到了问题。
矩阵 A 和 B 是时间步 dt = 1 / T 的函数,空格步 dx = 1 / M ,其中 T 和 M 是{ 0< x< 1 , 0< t }区域。矢量函数 f 也是如此。
对 x 的 A , B 和 f 的依赖性相当棘手:
A 和 B 是上和下三角矩阵(如 tridiagonal matrix;我想我们可以将它们称为 multidiagonal ),并在对角线上定义常量值。
给定点 0< xs< 1 ,我需要在网格中确定它的代表性 xn (最接近的),然后然后替换第n 行的 A 和 B 功能 v ( x )(当然是换位)和 nth f 行,功能 w ( x )。
总结, A = A ( dt , dx , xs , X )。 B 和 f 也是如此。
然后我需要做上面提到的循环,来定义你( x )= step[T]
。
希望我已经解释过了。
答案 0 :(得分:5)
我不确定它是否是最好的方法,但我只是使用普通的旧备忘录。您可以将单个步骤表示为
xstep[x_] := Inverse[A[x]](B[x].x + f[x])
然后
u[0] = x0
u[n_] := u[n] = xstep[u[n-1]]
如果您事先知道需要多少个值,并且出于某种原因预先计算它们是有利的(例如,您想要打开文件,使用其内容来计算xN
,然后释放内存) ,你可以使用NestList
。而不是前两行,你会做
xlist = NestList[xstep, x0, 10];
u[n_] := xlist[[n]]
当n > 10
时,这将会中断(显然,改变10以符合您的实际要求)。
当然,可能值得查看您的具体功能,看看您是否可以进行一些代数简化。
答案 1 :(得分:2)
我可能会写一个接受A0,B0,x0和f0的函数,然后返回A1,B1,x1和f1 - 比如说
step[A0_?MatrixQ, B0_?MatrixQ, x0_?VectorQ, f0_?VectorQ] := Module[...]
然后我会Nest
那个功能。没有更准确的信息,很难更精确。
另外,如果你的程序是数字的,那么你当然不想计算Inverse[A0]
,因为这不是一个数值稳定的操作。相反,你应该写
A0.x1 == B0.x0+f0
然后使用数值稳定的求解器查找x1
。当然,Mathematica的LinearSolve
提供了这样的算法。