做迭代方案的最佳方法

Pra*_*ava 3 iteration for-loop wolfram-mathematica

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

编辑:为清楚起见,将使用以下表示法:矩阵的粗体大写,矢量的粗体小写和标量的斜体.

假设x0是向量,AB是矩阵函数,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)

...
Run Code Online (Sandbox Code Playgroud)

我知道for-loop可以做到这一点,但我对Mathematica并不熟悉,我担心这是最有效的方法.这是一个合理的担忧,因为我想定义一个函数u(N):=xN并在进一步的计算中使用它.

我想我的问题是:

什么是最有效的方案编程方式?

RecurrenceTable一种方法吗?

编辑

这比我想的要复杂一点.我提供了更多细节,以便获得更全面的回复.

在重复之前,我在理解如何编写函数A,Bf时遇到问题.

矩阵的时间步长的功能DT = 1/T和空间步骤DX = 1/M,其中Ť中号是点在{数0 <X <1 ,0 <T }区域.对于向量函数f也是如此.

A,Bfx的依赖性相当棘手:

AB三角矩阵和下三角矩阵(就像三对角矩阵;我想我们可以将它们称为对角线),在对角线上定义了常数值.

给定点0 <xs <1,我需要确定它在网格中的代表性xn(最接近的),然后用函数v(x)替换AB第n行(当然是转置),并且f的第n行,函数为w(x).

总结,A = A(dt,dx,xs,x).Bf也是如此.

然后我需要做上面提到的循环,来定义u(x)= step[T].

希望我已经解释过了.

Dav*_*d Z 5

我不确定它是否是最好的方法,但我只是使用普通的旧备忘录.您可以将单个步骤表示为

xstep[x_] := Inverse[A[x]](B[x].x + f[x])
Run Code Online (Sandbox Code Playgroud)

然后

u[0] = x0
u[n_] := u[n] = xstep[u[n-1]]
Run Code Online (Sandbox Code Playgroud)

如果您事先知道需要多少个值,并且由于某种原因(例如,您想打开文件,使用其内容进行计算xN,然后释放内存)预先计算它们是有利的,您可以使用NestList.你可以做,而不是前两行

xlist = NestList[xstep, x0, 10];
u[n_] := xlist[[n]]
Run Code Online (Sandbox Code Playgroud)

n > 10当然,这会打破(显然,改变10以满足您的实际要求).

当然,可能值得查看您的特定功能,看看您是否可以进行一些代数简化.