For loop 执行迭代方案的最佳方法

For loop 执行迭代方案的最佳方法,for-loop,wolfram-mathematica,iteration,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)

我希望以前没有人问过这个问题,如果是的话,我道歉

编辑:为清晰起见,将使用以下符号:矩阵为粗体大写,向量为粗体小写,标量为斜体

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

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

我想我的问题是:

规划该计划最有效的方法是什么

RecurrenceTable

编辑

这比我想象的要复杂一点。我提供了更多的细节,以获得更彻底的回应

在执行重复之前,我在理解如何编程函数ABf时遇到问题

矩阵AB是时间步长dt=1/T和空间步长dx=1/M的函数,其中T和M是{0f的向量也是如此

ABfx的依赖性相当棘手:

AB是上下三角矩阵(类似于三对角矩阵;我想我们可以称它们为多对角矩阵),在其对角线上定义了常量值

给定一个点0v(x)替换aB的第n行(x)(当然是换位的),用函数w(x)替换f的第n行

总之,A=A(dt,dx,xs,x)。Bf也是如此

然后我需要执行上面提到的循环,以定义ux)=
step[T]


希望我已经解释过了。

我不确定这是否是最好的方法,但我会使用简单的旧备忘录。您可以将单个步骤表示为

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以满足您的实际需求)


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

我可能会编写一个函数,它接受A0、B0、x0和f0,然后返回A1、B1、x1和f1

step[A0_?MatrixQ, B0_?MatrixQ, x0_?VectorQ, f0_?VectorQ] := Module[...]
然后我将
嵌套该函数。没有更精确的信息,很难更精确

另外,如果您的过程是数值的,那么您肯定不想计算
逆[A0]
,因为这不是一个数值稳定的操作。相反,你应该写作

A0.x1 == B0.x0+f0

然后使用数值稳定解算器查找
x1
。当然,Mathematica的
LinearSolve
提供了这样一种算法。

是否
f
将向量映射到数字?和
A
B
,它们是可以用矩阵(向量向量映射)表示的映射,还是可以用矩阵值函数(向量矩阵映射)或矩阵函数(矩阵数映射)表示的映射?
x
是一个向量,例如,
Rn
f:Rn->Rn
A,B:Rn->Rn x Rn
。所有的格式都是数值格式,矩阵几乎都是常数,但由于格式是数值格式,所以没关系。应该在问题中澄清。让我在家里看看你的答案,
tic-toc
对照
for-loop
,我会再给你回复。最后使用了你的解决方案。非常感谢。让
步骤
列出一个列表会很有用,例如
步骤[{A0,…}]
,以便能够在
嵌套
中更轻松地使用它。更多详细信息将在第一次编辑中提供
LinearSolve
是一个很好的建议;我想它的工作原理类似于MATLAB中的
\
操作符。