Re: [问题] 递回方程式写法

楼主: chungyuandye (养花种鱼数月亮赏星星)   2014-09-26 14:59:16
※ 引述《GOLDRAN (贝卡斯)》之铭言:
: 我是最近才开始使用Mathematica的新手,有问题想请版上大大帮忙>"<
: 目的是要解出 Xn,Yn,Zn,其中n=1,2,3,...
: 经过整理可以得到Zn的三次方程式,式中包含Xn-1,Yn-1,Zn-1
: n=1的初始值是自己给的,使用NSolve解出3个根(1实根,2虚根)
: 将Zn的实根,代入Xn,Yn的方程式,可以得到Xn,Yn
: 下一步是将Xn,Yn,Zn取代原本的Xn-1,Yn-1,Zn-1,然后重复动作算出Zn+1
: 最后将X,Y,Z的值画成3D图
eqs={4x+3y+3z==350,4x+2y+5z==360,8x+8y+10z==840};
Solve[eqs,{x,y,z}]
ans=Block[{temp},
NestWhileList[(
(* 给定z,求x, y *)
temp=Solve[eqs[[3]]/.{x->#[[1]],y->#[[2]]},z,Reals][[1]];
(* 把x,y拿来求z *)
Flatten[{x,y,z/.temp}/.Solve[eqs[[1;;2]]/.temp,{x,y},Reals]]
(* 直到误差小于10^-5才停止 *)
)&,{0,0,0},(N[Norm[#1-#2]]>10^-5)&,2]
]
N@ans
Show[ContourPlot3D[Evaluate@eqs,{x,0,100},{y,0,100},{z,0,100},
ContourStyle->Opacity[0.2],Mesh->None],
(* 把图画出来 *)
Graphics3D[{Red,Arrow/@Partition[ans,2,1]}]]
: 请问连续代入解方程式,且会自动取实根的部份要怎么写呢?
?Solve
Solve[expr,vars,dom]
Solve[expr,vars,Reals]
作者: GOLDRAN (贝卡斯)   2014-09-26 17:05:00
感谢大大解答,我尝试看看>"<
作者: pig030 (FEBUR.PHEIX)   2014-10-02 11:50:00
太强大了,大大!我想请教一下大大在前面第一个Solve里面的#[[1]],#[[2]]这个设定,他是默认去那个边的值,这是怎么运作的呀。
作者: LPH66 (-6.2598534e+18f)   2014-10-02 23:57:00
# 是纯函式的参数 (其实它有名字叫 Slot) 不过在 temp 定义的时候因为还没有函数结尾的 & 出现, 所以只会留着 Slot一直到 temp 跟 Flatten[] 的 ()& 才把里面的 Slot 变成函数参数, 这一整个函数最后提供给 NestWhileList 做迭代另外要注意 #[[1]] 是指第一参数里的第一成员而不单指第一参数, 也就是这迭代函式吃的是 {x,y} 这种东西当然它自己也是吐出这种东西来 (所以才能迭代)
作者: pig030 (FEBUR.PHEIX)   2014-10-06 19:50:00
感谢大大的解说,真是精辟^^

Links booklink

Contact Us: admin [ a t ] ucptt.com