Pra*_*ava 3 iteration for-loop wolfram-mathematica
我希望以前没有问过,如果是的话,我道歉.
编辑:为清楚起见,将使用以下表示法:矩阵的粗体大写,矢量的粗体小写和标量的斜体.
假设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)
...
Run Code Online (Sandbox Code Playgroud)
我知道for-loop可以做到这一点,但我对Mathematica并不熟悉,我担心这是最有效的方法.这是一个合理的担忧,因为我想定义一个函数u(N):=xN并在进一步的计算中使用它.
我想我的问题是:
什么是最有效的方案编程方式?
是RecurrenceTable一种方法吗?
编辑
这比我想的要复杂一点.我提供了更多细节,以便获得更全面的回复.
在重复之前,我在理解如何编写函数A,B和f时遇到问题.
矩阵甲和乙的时间步长的功能DT = 1/T和空间步骤DX = 1/M,其中Ť和中号是点在{数0 <X <1 ,0 <T }区域.对于向量函数f也是如此.
A,B和f对x的依赖性相当棘手:
A和B是上三角矩阵和下三角矩阵(就像三对角矩阵;我想我们可以将它们称为多对角线),在对角线上定义了常数值.
给定点0 <xs <1,我需要确定它在网格中的代表性xn(最接近的),然后用函数v(x)替换A和B的第n行(当然是转置),并且f的第n行,函数为w(x).
总结,A = A(dt,dx,xs,x).B和f也是如此.
然后我需要做上面提到的循环,来定义u(x)= step[T].
希望我已经解释过了.
我不确定它是否是最好的方法,但我只是使用普通的旧备忘录.您可以将单个步骤表示为
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以满足您的实际要求).
当然,可能值得查看您的特定功能,看看您是否可以进行一些代数简化.
| 归档时间: |
|
| 查看次数: |
363 次 |
| 最近记录: |