Re: [问题] 循环写法询问

楼主: LPH66 (-6.2598534e+18f)   2014-06-10 19:42:37
※ 引述《bear0418 (贝尔出品 优质好文)》之铭言:
: 各位好
: 我有先看过说明里面有关循环的范例 可是里面的都是很单纯的举例
: 以我现在的程度 我没办法类比到我现在碰到的问题
: 所以来请问大家一下 希望可以帮忙
: 我现在碰到的问题是解harmonic oscillator 的 eigenvalue problem
: 我已经定义好了一个矩阵A (9 by 9)
: 现在我定义一个sv1=Table[1,{9}] (sv是starting vector)
: 计算 A.sv1 会给我一个新的vector 我们叫他sv2
: 接下来我要把sv2除以里面数字最大的那个元素
: 比如说 sv2是{-9,5,0,0,0,0,2,1,3}就除-9 sv2是{-5,2,3,0,1,2,6,8,12}就除12
: 这部分我是用以下方法解决(nf=normalized factor)
: nf2=
: Which[Abs[Max[sv2]]>Abs[Min[sv2],Max[SV2],Abs[Max[sv2]<Abs[Min[sv2]],Min[sv2]
: 所以上面给我我所需要的元素 除掉后会有一个被normalize过的vector
: 我们叫其 sv3=sv2/nf2
: 接下来我要计算A.sv3
: 然后重复以上步骤 将结果除以里面数字最大的元素->得到一个normalized的向量
: 再用A去打
: 最后我想看我所提出来的那个数字 nf会收敛到多少
: 这个问题我想很久了 我没办法把上述的流程整合成一个循环....
: 请大家帮帮忙 谢谢
也就是说一个循环里包含了两小步
第一小步是 A dot 第二小步则是 normalize
那么先定函数吧:
transform[v_] := A.Transpose[v]
normalize[v_] := v / If[Abs[Max[v]] >= Abs[Min[v]], Max[v], Min[v]]
说明一下
第一小步要加 Transpose 的原因是
如果你想这样内积, Dot 的右边应该要是 column vector
但你的中间结果却是 row vector 所以需要转置
而且这样一来 sv 得要写成 {Table[1, {9}]} 这样才是一个 2D row vector
单单 Table[1, {9}] 只是 1D vector 而已
第二小步由于你这里只有两个状况, 所以用 If 就足够了, 不需要用到 Which
Which 是在三个以上的条件时才会用
(不过要仔细考虑一下最大最小值绝对值相等的状况要哪边, 上面写的是这时选正的)
函数定好之后你的每个步骤就会是 normalize[transform[v]]
也把它定成函数:
step[v_] := normalize[transform[v]]
再来就是这篇的主角 函数迭代系列函式
这一系列函式共有以下成员:
Nest
NestWhile
Fold
FixedPoint
以及上面四个函式名后面多 List:
NestList
NestWhileList
FoldList
FixedPointList
一共八个函式
做的事情都很类似, 就是把一个结果不断地代入函式里直到某个时候为止
Nest 最单纯
Nest[f, x, n] 计算 f[f[f[...f[x]...]]] 一共 n 层 f 的结果
NestWhile 则稍微有点变化
NestWhile[f, x, g] 会一直套 f 到某一次的结果代入 g 得不到 True 为止
也就是会回传第一个使 g[f[...f[x]...]] 不为 True 的 f[...f[x]...]
Fold 是带额外参数的, 它比较像是 Accumulate 的推广
Fold[f, x, {a, b, c, ..., z}] 计算 f[...f[f[f[x, a], b], c]..., z] 的结果
FixedPoint 则是求不动点, 也就是代到不动了为止
FixedPoint[f, x] 从 x 开始, 代 f 之后再看看是不是不动了
回传代到不动的那个答案
这四个函式如果换成有 List 的名字的话
它会把所有中间结果都收集起来回传给你
得到的答案第一个是一开始给的 x, 最后一个则是没有 List 时的回传值
(Accumulate 的说明里有提到
Accumulate[list] 等同于 Rest[FoldList[Plus, 0, list]]
这就是为什么我说 Fold 比较像是 Accumulate 的推广)
以你的问题来说, 由于你是想观察收敛情形
使用 NestList 比较适合
NestList[step, sv, 10] 会回传一个含 11 个元素的 List
第一个是 sv, 第二个是一步之后的 sv, etc. 到第 11 个是 10 步之后的 sv
只不过由于你的元素是 row vector 的关系
因此中间结果收集起来会变成一个三维 List
不过这也不妨碍观察结果就是
作者: bear0418 (贝尔出品 优质好文)   2014-06-10 19:49:00
真的非常谢谢你 这对我真的吃力 才开接触这软件我会配合说明慢慢读你的写法 真的很感谢你的帮忙

Links booklink

Contact Us: admin [ a t ] ucptt.com