For loop 执行迭代方案的最佳方法
我希望以前没有人问过这个问题,如果是的话,我道歉 编辑:为清晰起见,将使用以下符号:矩阵为粗体大写,向量为粗体小写,标量为斜体 假设x0是一个向量,a和B是矩阵函数,f是一个向量函数 我正在寻找在Mathematica中执行以下迭代方案的最佳方法: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)
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
编辑
这比我想象的要复杂一点。我提供了更多的细节,以获得更彻底的回应
在执行重复之前,我在理解如何编程函数A、B和f时遇到问题
矩阵A和B是时间步长dt=1/T和空间步长dx=1/M的函数,其中T和M是{0step[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中的\
操作符。