做迭代方案的最佳方法

时间:2012-01-12 23:44:19

标签: for-loop wolfram-mathematica iteration

我希望以前没有问过,如果是的话,我道歉。

编辑:为清楚起见,将使用以下表示法:矩形用于矩阵的粗体,粗体用于向量的小写,以及用于标量的斜体。

假设 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]

希望我已经解释过了。

2 个答案:

答案 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提供了这样的算法。