2010年7月31日 星期六

[自動轉寄] Re: [程式] 有關mathematica求解的一個問題

作者: af2486 (我喜歡旅行)
標題: Re: [程式] 有關mathematica求解的一個問題
時間: Sat Jul 31 23:45:57 2010

您好~不好意思我想請問您的程式碼是要從哪邊開始貼呢?
或是說取代哪邊的程式碼...我取代"Do"這個指令後面的
要執行的時候好像有點小問題(出在函數的引數[]那邊,有個錯誤訊息)
不好意思才剛開始學連基本的debug都不太會...這小問題可能還要麻煩你了謝謝!

※ 引述《chungyuandye (養花種魚數月亮賞星星)》之銘言:
: ※ 引述《af2486 (我喜歡旅行)》之銘言:
: : ------------------------------------------------------------------------
: : [軟體程式類別]:Mathematica
: : 請填入軟體程式類別 例如SAS、SPSS、R、EVIEWS...等
: : [程式問題]:
: : 在用mathematica牛頓法求解時,會先給個固定值讓程式在那值附近求解(一連串的多組解)。
: : 不過後來發現往往後面求出的解會跑掉,因此現在要設定每次求解都以上一個算出來的值
: : 當作新的求解範圍。不過我不知道該用什麼指令好,有人能給個方向嗎?
: : xiLimit = 15.;
: : Hankel1[m_, x_] :=
: : If[Abs[x] < xiLimit, BesselJ[m, x] + I BesselY[m, x],
: : Sqrt[2/(Pi*x)] Exp[I*(x - m/2*Pi - Pi/4)]];
: : BesselJp[m_, x_] :=
: : If[Abs[x] < xiLimit,
: : D[BesselJ[m, x1],
: : x1] /. {x1 -> x}, -Sqrt[2/(Pi*x)] Sin[(x - m/2*Pi - Pi/4)]];
: : BesselYp[m_, x_] :=
: : If[Abs[x] < xiLimit, D[BesselY[m, x1], x1] /. {x1 -> x},
: : Sqrt[2/(Pi*x)] Cos[(x - m/2*Pi - Pi/4)]];
: : Hankel1p[m_, x_] :=
: : If[Abs[x] < xiLimit, D[Hankel1[m, x1], x1] /. {x1 -> x},
: : I*Sqrt[2/(Pi*x)] Exp[I*(x - m/2*Pi - Pi/4)]];
: : kr[kz_, k_] := Sqrt[k^2 - kz^2];
: : \[Alpha]r[kz_, k_] := Sqrt[kz^2 - k^2];
: : f[kz_, opt_] := Module[{sub},
: : k0 = \[Omega] Sqrt[\[Epsilon]0 \[Mu]0] /. opt;
: : k1 = \[Omega] Sqrt[\[Epsilon]1 \[Mu]1] /. opt;
: : k2 = \[Omega] Sqrt[\[Epsilon]2 \[Mu]2] /. opt;
: : r0 = r0 /. opt;
: : r1 = r1 /. opt;
: : m = m /. opt;
: : kr0 = kr[kz, k0];
: : kr1 = kr[kz, k1];
: : \[Alpha]r2 = \[Alpha]r[kz, k2];
: : BJ00 = BesselJ[m, kr[kz, k0] r0];
: : BJ10 = BesselJ[m, kr[kz, k1] r0];
: : BJ11 = BesselJ[m, kr[kz, k1] r1];
: : BY10 = BesselY[m, kr[kz, k1] r0];
: : BY11 = BesselY[m, kr[kz, k1] r1];
: : BJp00 = BesselJp[m, kr[kz, k0] r0];
: : BJp10 = BesselJp[m, kr[kz, k1] r0];
: : BJp11 = BesselJp[m, kr[kz, k1] r1];
: : BYp10 = BesselYp[m, kr[kz, k1] r0];
: : BYp11 = BesselYp[m, kr[kz, k1] r1];
: : HA21 = Hankel1[m, I \[Alpha]r[kz, k2] r1];
: : HAp21 = Hankel1p[m, I \[Alpha]r[kz, k2] r1];
: : M = {{BJ00, 0, -BJ10, -BY10 , 0, 0, 0, 0},
: : {0, BJ00, 0, 0, -BJ10, -BY10, 0, 0},
: : {(\[Omega] \[Epsilon]0)/(kr0 r0) BJp00, (m kz)/(kr0^2 r0^2)
: : BJ00, -((\[Omega] \[Epsilon]1)/(kr1 r0))
: : BJp10, -((\[Omega] \[Epsilon]1)/(kr1 r0)) BYp10, -((m kz)/(
: : kr1^2 r0^2)) BJ10, -((m kz)/(kr1^2 r0^2)) BY10, 0, 0},
: : {(m kz)/(kr0^2 r0^2) BJ00, (\[Omega] \[Mu]0)/(kr0 r0)
: : BJp00, -((m kz)/(kr1^2 r0^2)) BJ10, -((m kz)/(kr1^2 r0^2))
: : BY10, -((\[Omega] \[Mu]1)/(kr1 r0))
: : BJp10, -((\[Omega] \[Mu]1)/(kr1 r0)) BYp10, 0, 0 },
: : {0, 0, BJ11, BY11 , 0, 0, -HA21, 0},
: : {0, 0, 0, 0, BJ11, BY11, 0, -HA21},
: : {0, 0, (\[Omega] \[Epsilon]1)/(kr1 r1)
: : BJp11, (\[Omega] \[Epsilon]1)/(kr1 r1) BYp11, (m kz)/(
: : kr1^2 r1^2) BJ11, (m kz)/(kr1^2 r1^2) BY11, (
: : I \[Omega] \[Epsilon]2)/(\[Alpha]r2 r1) HAp21, (
: : m kz)/(\[Alpha]r2^2 r1^2) HA21},
: : {0, 0, (m kz)/(kr1^2 r1^2) BJ11, (m kz)/(kr1^2 r1^2)
: : BY11, (\[Omega] \[Mu]1)/(kr1 r1) BJp11, (\[Omega] \[Mu]1)/(
: : kr1 r1) BYp11, (m kz)/(\[Alpha]r2^2 r1^2) HA21, (
: : I \[Omega] \[Mu]2)/(\[Alpha]r2 r1) HAp21}
: : } /. opt;
: : equ = Det[M];
: : Return[equ];
: : ]
: : Do[
: : n0 = Sqrt[
: : 1 + (0.68671749* lambda^2)/(lambda^2 -
: : 0.072675189^2) + (0.43481505* lambda^2)/(lambda^2 -
: : 0.11514351^2) + (0.89656582* lambda^2)/(lambda^2 -
: : 10.002398^2)];
: : n1 = Sqrt[
: : 1 + (0.6961663* lambda^2)/(lambda^2 - 0.0684043^2) + (0.4079426*
: : lambda^2)/(lambda^2 - 0.1162414^2) + (0.8974794*
: : lambda^2)/(lambda^2 - 9.896161^2)];
: : n2 = 1.0;
: : opt = {m -> 1, \[Omega] -> 2 Pi/lambda, r0 -> 4.1,
: : r1 -> 62.5, \[Epsilon]0 -> n0^2, \[Mu]0 -> 1., \[Epsilon]1 ->
: : n1^2, \[Mu]1 -> 1., \[Epsilon]2 -> n2^2, \[Mu]2 -> 1., kz -> y};
: : sol2 = FindRoot[f[y*(2 Pi/lambda), opt] == 0, {y, 1.4435}];
: : Print[FullForm[Re[sol2[[1, 2]]]]],
: : {lambda, 1.54, 1.56, 0.001}]
: : 以上是部分程式碼,從1.54~1.56每次加0.001在1.4435附近求解,會求出21組解。現在想要
: : 每算完一組解就以這個解當新的值繼續往下算;例如說1.54算出1.4480196760169795,
: : 1.541就以這個值往下算,之後的以此類推。請問這樣程式碼要怎改比較好呢?謝謝!
: : [軟體熟悉度]:
: : 低(1~3個月)
: : -----------------------------------------------------------------------------
: n0[lambda_]:=Sqrt[1+(0.68671749*lambda^2)/(lambda^2-
: 0.072675189^2)+(0.43481505*lambda^2)/(lambda^2-
: 0.11514351^2)+(0.89656582*lambda^2)/(lambda^2-10.002398^2)];
: n1[lambda_]:=Sqrt[1+(0.6961663*lambda^2)/(lambda^2-0.0684043^2)+(0.4079426*
: lambda^2)/(lambda^2-0.1162414^2)+(0.8974794*
: lambda^2)/(lambda^2-9.896161^2)];
: n2[lambda_]:=1.0;
: opt[lambda_]:={m->1,\[Omega]->2Pi/lambda,r0->4.1,
: r1->62.5,\[Epsilon]0->n0[lambda]^2,\[Mu]0->
: 1.,\[Epsilon]1->n1[lambda]^2,\[Mu]1->1.,\[Epsilon]2->
: n2[lambda]^2,\[Mu]2->1.,kz->y};
: NestList[{#[[1]]+0.01,#[[3]],Re@y}/.
: FindRoot[f[y*(2Pi/(#[[1]]+0.01)),opt[#[[1]]+0.01]],{y,#[[3]]}]&,
: {1.53,1.4435,1.4435},20][[2;;-1]]//TableForm

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.252.213.103

2010年7月30日 星期五

Fwd: [程式] 有關mathematica求解的一個問題

n0[lambda_]:=
Sqrt[1+(0.68671749*lambda^2)/(lambda^2-
0.072675189^2)+(0.43481505*lambda^2)/(lambda^2-
0.11514351^2)+(0.89656582*lambda^2)/(lambda^2-10.002398^2)];

n1[lambda_]:=
Sqrt[1+(0.6961663*lambda^2)/(lambda^2-0.0684043^2)+(0.4079426*
lambda^2)/(lambda^2-0.1162414^2)+(0.8974794*
lambda^2)/(lambda^2-9.896161^2)];

n2[lambda_]:=1.0;
opt[lambda_]:={m->1,\[Omega]->2Pi/lambda,r0->4.1,
r1->62.5,\[Epsilon]0->n0[lambda]^2,\[Mu]0->
1.,\[Epsilon]1->n1[lambda]^2,\[Mu]1->1.,\[Epsilon]2->
n2[lambda]^2,\[Mu]2->1.,kz->y};

NestList[{#[[1]]+0.01,#[[3]],Re@y}/.
FindRoot[f[y*(2Pi/(#[[1]]+0.01)),opt[#[[1]]+0.01]]==
0,{y,#[[3]]}]&,{1.53,1.4435,1.4435},
20][[2;;-1]]//TableForm

---------- 轉寄的郵件 ----------
寄件者: chungyuandye.bbs@ptt.cc <chungyuandye.bbs@ptt.cc>
日期: 2010年7月31日上午2:55
主旨: [程式] 有關mathematica求解的一個問題
收件者: chungyuandye@gmail.com


作者: af2486 (我喜歡旅行) 看板: Statistics
標題: [程式] 有關mathematica求解的一個問題
時間: Thu Jul 29 17:26:11 2010


------------------------------------------------------------------------

[軟體程式類別]:Mathematica
 [1;30m請填入軟體程式類別  例如SAS、SPSS、R、EVIEWS...等 [m

[程式問題]:
在用mathematica牛頓法求解時,會先給個固定值讓程式在那值附近求解(一連串的多組解)。
不過後來發現往往後面求出的解會跑掉,因此現在要設定每次求解都以上一個算出來的值
當作新的求解範圍。不過我不知道該用什麼指令好,有人能給個方向嗎?

xiLimit = 15.;
Hankel1[m_, x_] :=
 If[Abs[x] < xiLimit, BesselJ[m, x] + I BesselY[m, x],
  Sqrt[2/(Pi*x)] Exp[I*(x - m/2*Pi - Pi/4)]];
BesselJp[m_, x_] :=
 If[Abs[x] < xiLimit,
  D[BesselJ[m, x1],
    x1] /. {x1 -> x}, -Sqrt[2/(Pi*x)] Sin[(x - m/2*Pi - Pi/4)]];
BesselYp[m_, x_] :=
 If[Abs[x] < xiLimit, D[BesselY[m, x1], x1] /. {x1 -> x},
  Sqrt[2/(Pi*x)] Cos[(x - m/2*Pi - Pi/4)]];
Hankel1p[m_, x_] :=
 If[Abs[x] < xiLimit, D[Hankel1[m, x1], x1] /. {x1 -> x},
  I*Sqrt[2/(Pi*x)] Exp[I*(x - m/2*Pi - Pi/4)]];
kr[kz_, k_] := Sqrt[k^2 - kz^2];
\[Alpha]r[kz_, k_] := Sqrt[kz^2 - k^2];

f[kz_, opt_] := Module[{sub},
 k0 = \[Omega] Sqrt[\[Epsilon]0 \[Mu]0] /. opt;
 k1 = \[Omega] Sqrt[\[Epsilon]1 \[Mu]1] /. opt;
 k2 = \[Omega] Sqrt[\[Epsilon]2 \[Mu]2] /. opt;
 r0 = r0 /. opt;
 r1 = r1 /. opt;
 m = m /. opt;
 kr0 = kr[kz, k0];
 kr1 = kr[kz, k1];
 \[Alpha]r2 = \[Alpha]r[kz, k2];
 BJ00 = BesselJ[m, kr[kz, k0] r0];
 BJ10 = BesselJ[m, kr[kz, k1] r0];
 BJ11 = BesselJ[m, kr[kz, k1] r1];
 BY10 = BesselY[m, kr[kz, k1] r0];
 BY11 = BesselY[m, kr[kz, k1] r1];
 BJp00 = BesselJp[m, kr[kz, k0] r0];
 BJp10 = BesselJp[m, kr[kz, k1] r0];
 BJp11 = BesselJp[m, kr[kz, k1] r1];
 BYp10 = BesselYp[m, kr[kz, k1] r0];
 BYp11 = BesselYp[m, kr[kz, k1] r1];
 HA21 = Hankel1[m, I \[Alpha]r[kz, k2] r1];
 HAp21 = Hankel1p[m, I \[Alpha]r[kz, k2] r1];
 M = {{BJ00, 0, -BJ10, -BY10 , 0, 0, 0, 0},
    {0, BJ00, 0, 0, -BJ10, -BY10, 0, 0},
    {(\[Omega] \[Epsilon]0)/(kr0 r0) BJp00, (m kz)/(kr0^2 r0^2)
       BJ00, -((\[Omega] \[Epsilon]1)/(kr1 r0))
        BJp10, -((\[Omega] \[Epsilon]1)/(kr1 r0)) BYp10, -((m kz)/(
       kr1^2 r0^2)) BJ10, -((m kz)/(kr1^2 r0^2)) BY10, 0, 0},
    {(m kz)/(kr0^2 r0^2) BJ00, (\[Omega] \[Mu]0)/(kr0 r0)
       BJp00, -((m kz)/(kr1^2 r0^2)) BJ10, -((m kz)/(kr1^2 r0^2))
        BY10, -((\[Omega] \[Mu]1)/(kr1 r0))
        BJp10, -((\[Omega] \[Mu]1)/(kr1 r0)) BYp10, 0, 0 },
    {0, 0, BJ11, BY11 , 0, 0, -HA21, 0},
    {0, 0, 0, 0, BJ11, BY11, 0, -HA21},
    {0, 0, (\[Omega] \[Epsilon]1)/(kr1 r1)
       BJp11, (\[Omega] \[Epsilon]1)/(kr1 r1) BYp11, (m kz)/(
      kr1^2 r1^2) BJ11, (m kz)/(kr1^2 r1^2) BY11, (
      I \[Omega] \[Epsilon]2)/(\[Alpha]r2 r1) HAp21, (
      m kz)/(\[Alpha]r2^2 r1^2) HA21},
    {0, 0, (m kz)/(kr1^2 r1^2) BJ11, (m kz)/(kr1^2 r1^2)
       BY11, (\[Omega] \[Mu]1)/(kr1 r1) BJp11, (\[Omega] \[Mu]1)/(
      kr1 r1) BYp11, (m kz)/(\[Alpha]r2^2 r1^2) HA21, (
      I \[Omega] \[Mu]2)/(\[Alpha]r2 r1) HAp21}
    } /. opt;
 equ = Det[M];
 Return[equ];
 ]

Do[
 n0 = Sqrt[
  1 + (0.68671749* lambda^2)/(lambda^2 -
      0.072675189^2) + (0.43481505* lambda^2)/(lambda^2 -
      0.11514351^2) + (0.89656582* lambda^2)/(lambda^2 -
      10.002398^2)];
 n1 = Sqrt[
  1 + (0.6961663* lambda^2)/(lambda^2 - 0.0684043^2) + (0.4079426*
      lambda^2)/(lambda^2 - 0.1162414^2) + (0.8974794*
      lambda^2)/(lambda^2 - 9.896161^2)];
 n2 = 1.0;
 opt = {m -> 1, \[Omega] -> 2 Pi/lambda, r0 -> 4.1,
  r1 -> 62.5, \[Epsilon]0 -> n0^2, \[Mu]0 -> 1., \[Epsilon]1 ->
   n1^2, \[Mu]1 -> 1., \[Epsilon]2 -> n2^2, \[Mu]2 -> 1., kz -> y};
 sol2 = FindRoot[f[y*(2 Pi/lambda), opt] == 0, {y, 1.4435}];
 Print[FullForm[Re[sol2[[1, 2]]]]],
 {lambda, 1.54, 1.56, 0.001}]

以上是部分程式碼,從1.54~1.56每次加0.001在1.4435附近求解,會求出21組解。現在想要
每算完一組解就以這個解當新的值繼續往下算;例如說1.54算出1.4480196760169795,
1.541就以這個值往下算,之後的以此類推。請問這樣程式碼要怎改比較好呢?謝謝!

[軟體熟悉度]:
低(1~3個月)

-----------------------------------------------------------------------------

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.41.12
 [1;37m推  [33mchungyuandye [m [33m:沒有f的定義                                        [m 07/30 10:54
※ 編輯: af2486          來自: 111.252.204.176      (07/30 23:00)
 [1;31m→  [33maf2486 [m [33m:已附上完整程式碼                                         [m 07/30 23:02




--
Chung-Yuan Dye

養花種魚數月亮賞星星
http://cydye1069.blogspot.com

[自動轉寄] [程式] 有關mathematica求解的一個問題

作者: af2486 (我喜歡旅行) 看板: Statistics
標題: [程式] 有關mathematica求解的一個問題
時間: Thu Jul 29 17:26:11 2010


------------------------------------------------------------------------

[軟體程式類別]:Mathematica
請填入軟體程式類別 例如SAS、SPSS、R、EVIEWS...等

[程式問題]:
在用mathematica牛頓法求解時,會先給個固定值讓程式在那值附近求解(一連串的多組解)。
不過後來發現往往後面求出的解會跑掉,因此現在要設定每次求解都以上一個算出來的值
當作新的求解範圍。不過我不知道該用什麼指令好,有人能給個方向嗎?

xiLimit = 15.;
Hankel1[m_, x_] :=
If[Abs[x] < xiLimit, BesselJ[m, x] + I BesselY[m, x],
Sqrt[2/(Pi*x)] Exp[I*(x - m/2*Pi - Pi/4)]];
BesselJp[m_, x_] :=
If[Abs[x] < xiLimit,
D[BesselJ[m, x1],
x1] /. {x1 -> x}, -Sqrt[2/(Pi*x)] Sin[(x - m/2*Pi - Pi/4)]];
BesselYp[m_, x_] :=
If[Abs[x] < xiLimit, D[BesselY[m, x1], x1] /. {x1 -> x},
Sqrt[2/(Pi*x)] Cos[(x - m/2*Pi - Pi/4)]];
Hankel1p[m_, x_] :=
If[Abs[x] < xiLimit, D[Hankel1[m, x1], x1] /. {x1 -> x},
I*Sqrt[2/(Pi*x)] Exp[I*(x - m/2*Pi - Pi/4)]];
kr[kz_, k_] := Sqrt[k^2 - kz^2];
\[Alpha]r[kz_, k_] := Sqrt[kz^2 - k^2];

f[kz_, opt_] := Module[{sub},
k0 = \[Omega] Sqrt[\[Epsilon]0 \[Mu]0] /. opt;
k1 = \[Omega] Sqrt[\[Epsilon]1 \[Mu]1] /. opt;
k2 = \[Omega] Sqrt[\[Epsilon]2 \[Mu]2] /. opt;
r0 = r0 /. opt;
r1 = r1 /. opt;
m = m /. opt;
kr0 = kr[kz, k0];
kr1 = kr[kz, k1];
\[Alpha]r2 = \[Alpha]r[kz, k2];
BJ00 = BesselJ[m, kr[kz, k0] r0];
BJ10 = BesselJ[m, kr[kz, k1] r0];
BJ11 = BesselJ[m, kr[kz, k1] r1];
BY10 = BesselY[m, kr[kz, k1] r0];
BY11 = BesselY[m, kr[kz, k1] r1];
BJp00 = BesselJp[m, kr[kz, k0] r0];
BJp10 = BesselJp[m, kr[kz, k1] r0];
BJp11 = BesselJp[m, kr[kz, k1] r1];
BYp10 = BesselYp[m, kr[kz, k1] r0];
BYp11 = BesselYp[m, kr[kz, k1] r1];
HA21 = Hankel1[m, I \[Alpha]r[kz, k2] r1];
HAp21 = Hankel1p[m, I \[Alpha]r[kz, k2] r1];
M = {{BJ00, 0, -BJ10, -BY10 , 0, 0, 0, 0},
{0, BJ00, 0, 0, -BJ10, -BY10, 0, 0},
{(\[Omega] \[Epsilon]0)/(kr0 r0) BJp00, (m kz)/(kr0^2 r0^2)
BJ00, -((\[Omega] \[Epsilon]1)/(kr1 r0))
BJp10, -((\[Omega] \[Epsilon]1)/(kr1 r0)) BYp10, -((m kz)/(
kr1^2 r0^2)) BJ10, -((m kz)/(kr1^2 r0^2)) BY10, 0, 0},
{(m kz)/(kr0^2 r0^2) BJ00, (\[Omega] \[Mu]0)/(kr0 r0)
BJp00, -((m kz)/(kr1^2 r0^2)) BJ10, -((m kz)/(kr1^2 r0^2))
BY10, -((\[Omega] \[Mu]1)/(kr1 r0))
BJp10, -((\[Omega] \[Mu]1)/(kr1 r0)) BYp10, 0, 0 },
{0, 0, BJ11, BY11 , 0, 0, -HA21, 0},
{0, 0, 0, 0, BJ11, BY11, 0, -HA21},
{0, 0, (\[Omega] \[Epsilon]1)/(kr1 r1)
BJp11, (\[Omega] \[Epsilon]1)/(kr1 r1) BYp11, (m kz)/(
kr1^2 r1^2) BJ11, (m kz)/(kr1^2 r1^2) BY11, (
I \[Omega] \[Epsilon]2)/(\[Alpha]r2 r1) HAp21, (
m kz)/(\[Alpha]r2^2 r1^2) HA21},
{0, 0, (m kz)/(kr1^2 r1^2) BJ11, (m kz)/(kr1^2 r1^2)
BY11, (\[Omega] \[Mu]1)/(kr1 r1) BJp11, (\[Omega] \[Mu]1)/(
kr1 r1) BYp11, (m kz)/(\[Alpha]r2^2 r1^2) HA21, (
I \[Omega] \[Mu]2)/(\[Alpha]r2 r1) HAp21}
} /. opt;
equ = Det[M];
Return[equ];
]

Do[
n0 = Sqrt[
1 + (0.68671749* lambda^2)/(lambda^2 -
0.072675189^2) + (0.43481505* lambda^2)/(lambda^2 -
0.11514351^2) + (0.89656582* lambda^2)/(lambda^2 -
10.002398^2)];
n1 = Sqrt[
1 + (0.6961663* lambda^2)/(lambda^2 - 0.0684043^2) + (0.4079426*
lambda^2)/(lambda^2 - 0.1162414^2) + (0.8974794*
lambda^2)/(lambda^2 - 9.896161^2)];
n2 = 1.0;
opt = {m -> 1, \[Omega] -> 2 Pi/lambda, r0 -> 4.1,
r1 -> 62.5, \[Epsilon]0 -> n0^2, \[Mu]0 -> 1., \[Epsilon]1 ->
n1^2, \[Mu]1 -> 1., \[Epsilon]2 -> n2^2, \[Mu]2 -> 1., kz -> y};
sol2 = FindRoot[f[y*(2 Pi/lambda), opt] == 0, {y, 1.4435}];
Print[FullForm[Re[sol2[[1, 2]]]]],
{lambda, 1.54, 1.56, 0.001}]

以上是部分程式碼,從1.54~1.56每次加0.001在1.4435附近求解,會求出21組解。現在想要
每算完一組解就以這個解當新的值繼續往下算;例如說1.54算出1.4480196760169795,
1.541就以這個值往下算,之後的以此類推。請問這樣程式碼要怎改比較好呢?謝謝!

[軟體熟悉度]:
低(1~3個月)

-----------------------------------------------------------------------------

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.41.12
推 chungyuandye:沒有f的定義  07/30 10:54
※ 編輯: af2486 來自: 111.252.204.176 (07/30 23:00)
→ af2486:已附上完整程式碼  07/30 23:02

[自動轉寄] [程式] 有關mathematica求解的一個問題

作者: af2486 (我喜歡旅行) 看板: Statistics
標題: [程式] 有關mathematica求解的一個問題
時間: Thu Jul 29 17:26:11 2010


------------------------------------------------------------------------

[軟體程式類別]:Mathematica
請填入軟體程式類別 例如SAS、SPSS、R、EVIEWS...等

[程式問題]:
在用mathematica牛頓法求解時,會先給個固定值讓程式在那值附近求解(一連串的多組解)。
不過後來發現往往後面求出的解會跑掉,因此現在要設定每次求解都以上一個算出來的值
當作新的求解範圍。不過我不知道該用什麼指令好,有人能給個方向嗎?

xiLimit = 15.;
Hankel1[m_, x_] :=
If[Abs[x] < xiLimit, BesselJ[m, x] + I BesselY[m, x],
Sqrt[2/(Pi*x)] Exp[I*(x - m/2*Pi - Pi/4)]];
BesselJp[m_, x_] :=
If[Abs[x] < xiLimit,
D[BesselJ[m, x1],
x1] /. {x1 -> x}, -Sqrt[2/(Pi*x)] Sin[(x - m/2*Pi - Pi/4)]];
BesselYp[m_, x_] :=
If[Abs[x] < xiLimit, D[BesselY[m, x1], x1] /. {x1 -> x},
Sqrt[2/(Pi*x)] Cos[(x - m/2*Pi - Pi/4)]];
Hankel1p[m_, x_] :=
If[Abs[x] < xiLimit, D[Hankel1[m, x1], x1] /. {x1 -> x},
I*Sqrt[2/(Pi*x)] Exp[I*(x - m/2*Pi - Pi/4)]];
kr[kz_, k_] := Sqrt[k^2 - kz^2];
\[Alpha]r[kz_, k_] := Sqrt[kz^2 - k^2];

f[kz_, opt_] := Module[{sub},
k0 = \[Omega] Sqrt[\[Epsilon]0 \[Mu]0] /. opt;
k1 = \[Omega] Sqrt[\[Epsilon]1 \[Mu]1] /. opt;
k2 = \[Omega] Sqrt[\[Epsilon]2 \[Mu]2] /. opt;
r0 = r0 /. opt;
r1 = r1 /. opt;
m = m /. opt;
kr0 = kr[kz, k0];
kr1 = kr[kz, k1];
\[Alpha]r2 = \[Alpha]r[kz, k2];
BJ00 = BesselJ[m, kr[kz, k0] r0];
BJ10 = BesselJ[m, kr[kz, k1] r0];
BJ11 = BesselJ[m, kr[kz, k1] r1];
BY10 = BesselY[m, kr[kz, k1] r0];
BY11 = BesselY[m, kr[kz, k1] r1];
BJp00 = BesselJp[m, kr[kz, k0] r0];
BJp10 = BesselJp[m, kr[kz, k1] r0];
BJp11 = BesselJp[m, kr[kz, k1] r1];
BYp10 = BesselYp[m, kr[kz, k1] r0];
BYp11 = BesselYp[m, kr[kz, k1] r1];
HA21 = Hankel1[m, I \[Alpha]r[kz, k2] r1];
HAp21 = Hankel1p[m, I \[Alpha]r[kz, k2] r1];
M = {{BJ00, 0, -BJ10, -BY10 , 0, 0, 0, 0},
{0, BJ00, 0, 0, -BJ10, -BY10, 0, 0},
{(\[Omega] \[Epsilon]0)/(kr0 r0) BJp00, (m kz)/(kr0^2 r0^2)
BJ00, -((\[Omega] \[Epsilon]1)/(kr1 r0))
BJp10, -((\[Omega] \[Epsilon]1)/(kr1 r0)) BYp10, -((m kz)/(
kr1^2 r0^2)) BJ10, -((m kz)/(kr1^2 r0^2)) BY10, 0, 0},
{(m kz)/(kr0^2 r0^2) BJ00, (\[Omega] \[Mu]0)/(kr0 r0)
BJp00, -((m kz)/(kr1^2 r0^2)) BJ10, -((m kz)/(kr1^2 r0^2))
BY10, -((\[Omega] \[Mu]1)/(kr1 r0))
BJp10, -((\[Omega] \[Mu]1)/(kr1 r0)) BYp10, 0, 0 },
{0, 0, BJ11, BY11 , 0, 0, -HA21, 0},
{0, 0, 0, 0, BJ11, BY11, 0, -HA21},
{0, 0, (\[Omega] \[Epsilon]1)/(kr1 r1)
BJp11, (\[Omega] \[Epsilon]1)/(kr1 r1) BYp11, (m kz)/(
kr1^2 r1^2) BJ11, (m kz)/(kr1^2 r1^2) BY11, (
I \[Omega] \[Epsilon]2)/(\[Alpha]r2 r1) HAp21, (
m kz)/(\[Alpha]r2^2 r1^2) HA21},
{0, 0, (m kz)/(kr1^2 r1^2) BJ11, (m kz)/(kr1^2 r1^2)
BY11, (\[Omega] \[Mu]1)/(kr1 r1) BJp11, (\[Omega] \[Mu]1)/(
kr1 r1) BYp11, (m kz)/(\[Alpha]r2^2 r1^2) HA21, (
I \[Omega] \[Mu]2)/(\[Alpha]r2 r1) HAp21}
} /. opt;
equ = Det[M];
Return[equ];
]

Do[
n0 = Sqrt[
1 + (0.68671749* lambda^2)/(lambda^2 -
0.072675189^2) + (0.43481505* lambda^2)/(lambda^2 -
0.11514351^2) + (0.89656582* lambda^2)/(lambda^2 -
10.002398^2)];
n1 = Sqrt[
1 + (0.6961663* lambda^2)/(lambda^2 - 0.0684043^2) + (0.4079426*
lambda^2)/(lambda^2 - 0.1162414^2) + (0.8974794*
lambda^2)/(lambda^2 - 9.896161^2)];
n2 = 1.0;
opt = {m -> 1, \[Omega] -> 2 Pi/lambda, r0 -> 4.1,
r1 -> 62.5, \[Epsilon]0 -> n0^2, \[Mu]0 -> 1., \[Epsilon]1 ->
n1^2, \[Mu]1 -> 1., \[Epsilon]2 -> n2^2, \[Mu]2 -> 1., kz -> y};
sol2 = FindRoot[f[y*(2 Pi/lambda), opt] == 0, {y, 1.4435}];
Print[FullForm[Re[sol2[[1, 2]]]]],
{lambda, 1.54, 1.56, 0.001}]

以上是部分程式碼,從1.54~1.56每次加0.001在1.4435附近求解,會求出21組解。現在想要
每算完一組解就以這個解當新的值繼續往下算;例如說1.54算出1.4480196760169795,
1.541就以這個值往下算,之後的以此類推。請問這樣程式碼要怎改比較好呢?謝謝!

[軟體熟悉度]:
低(1~3個月)

-----------------------------------------------------------------------------

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.41.12
推 chungyuandye:沒有f的定義  07/30 10:54
※ 編輯: af2486 來自: 111.252.204.176 (07/30 23:00)
→ af2486:已附上完整程式碼  07/30 23:02

2010年7月29日 星期四

Re: [問題] mathematica 的block用法和三個問題

作者: Passions (passion)
標題: Re: [問題] mathematica 的block用法和三個問題
時間: Sun Jul 25 16:39:26 2010

※ 引述《chungyuandye (養花種魚數月亮賞星星)》之銘言:
: ※ 引述《Passions (passion)》之銘言:
: : 謝謝你的回信!
: : 不過仍然有幾個問題:
: : 一、關於 Block 的用法,仍有一點不清楚。
: : 原式中的 Block[{A},B ; C ; D ]
: : 分號; 在 mathematica 中,應該是代表指令結束,
: : 但在這邊還是被包在 Block 裡面,這真的是非常奇怪,不知道語法是什麼。
: 忘了說,;在mathematica表示指令結束但不輸出,
: 不加分號就是指令結束而且輸出!
: qq=(a+b)^2;ss=(a+b)^2
: qq
: ss
: 但這個在Block、Modual、With裡面就不行
: 指令動作之前一定要加分號
: 有問題在到我blog留言討論吧∼

真的是太謝謝你了! 我好像看懂了!

若程式碼為: f[x_]:=Block[{A},B ; C ; D ]

則 Block 的 "body" 是 B;C;D (還是只有 B?不過感覺是BCD都屬於Block的body)

而 {A} 是用來形容哪些變數是不受外界影響的。


然後,因為只輸出D的值,所以也就等同於 f[x_]=D ,而 B、C 只是用來幫助運算

不曉得這樣子理解有沒有錯…


--
我有到你的部落格留言喔~ :)

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.114.123.137

(Passions) Re: [問題] mathematica 的block用法和三個問題

作者: chungyuandye (養花種魚數月亮賞星星)
標題: Re: [問題] mathematica 的block用法和三個問題
時間: Sat Jul 24 19:32:20 2010


※ 引述《Passions (passion)》之銘言:
: ※ 引述《chungyuandye (養花種魚數月亮賞星星)》之銘言:
: : {r,n,t,y}是區域變數,只有在f這個函數才有作用,一旦跳出f它什麼都不是
: : 舉個例子
: : g[x_]:=Block[{w=10,xx=x},2xx+w]
: : 執行一下
: : g[10]
: : {ww,xx}
: : g[10]=30
: : {ww,xx}={ww,xx}
: : 不過為了怕之前L,G,K這些變數已經有定義過,建議改成這樣
: : f[L_?NumberQ,G_?NumberQ,K_NumberQ]:=Block[{LL=L,GG=G,KK=K,r,n,t,y},
: : {r}=NDSolve[{包含n,t,LL,GG的微分方程式,n[0]==K},n,{t,0,10}];
: : y=n[a] /. r;Plus @@ ((b-y)^2)]
: : @@=Apply,Plus @@ ((b-y)^2)] =>把加法套用在((b-y)^2)上
: 謝謝你的回信!
: 不過仍然有幾個問題:
: 一、關於 Block 的用法,仍有一點不清楚。
: 原式中的 Block[{A},B ; C ; D ]
: 分號; 在 mathematica 中,應該是代表指令結束,
: 但在這邊還是被包在 Block 裡面,這真的是非常奇怪,不知道語法是什麼。

忘了說,;在mathematica表示指令結束但不輸出,
不加分號就是指令結束而且輸出!
qq=(a+b)^2;ss=(a+b)^2
qq
ss

但這個在Block、Modual、With裡面就不行
指令動作之前一定要加分號

有問題在到我blog留言討論吧∼


--
養花種魚數月亮賞星星

http://cydye1069.blogspot.com

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.173.130.58

(Passions) Re: [問題] mathematica 的block用法和三個問題

作者: chungyuandye (養花種魚數月亮賞星星)
標題: Re: [問題] mathematica 的block用法和三個問題
時間: Sat Jul 24 19:17:36 2010

※ 引述《Passions (passion)》之銘言:
: ※ 引述《chungyuandye (養花種魚數月亮賞星星)》之銘言:
: : {r,n,t,y}是區域變數,只有在f這個函數才有作用,一旦跳出f它什麼都不是
: : 舉個例子
: : g[x_]:=Block[{w=10,xx=x},2xx+w]
: : 執行一下
: : g[10]
: : {ww,xx}
: : g[10]=30
: : {ww,xx}={ww,xx}
: : 不過為了怕之前L,G,K這些變數已經有定義過,建議改成這樣
: : f[L_?NumberQ,G_?NumberQ,K_NumberQ]:=Block[{LL=L,GG=G,KK=K,r,n,t,y},
: : {r}=NDSolve[{包含n,t,LL,GG的微分方程式,n[0]==K},n,{t,0,10}];
: : y=n[a] /. r;Plus @@ ((b-y)^2)]
: : @@=Apply,Plus @@ ((b-y)^2)] =>把加法套用在((b-y)^2)上
: 謝謝你的回信!
: 不過仍然有幾個問題:
: 一、關於 Block 的用法,仍有一點不清楚。
: 原式中的 Block[{A},B ; C ; D ]
: 分號; 在 mathematica 中,應該是代表指令結束,

執行B->執行C->最後輸出D
你就當成你在寫程式就好了∼∼

: 但在這邊還是被包在 Block 裡面,這真的是非常奇怪,不知道語法是什麼。
: 二、Plus @@ ((b-y)^2)]
: 這個跑出來的結果會是 2 + b - y
: 這真的是非常奇怪,直接把它當2看,這樣不就把平方的意義給弄掉了嗎

這個一點都不奇怪,因為在Mathematica裡面
如果你把((b-y)^2)當成一個List,那第一個元素是b,第二個元素是-y,
第三個元素2,你把加法套到這三個元素當然是2+b-y

: 不過又回到第一個問題來,還是他在Block 裡能表現出特別的意義來?
: 三、舉的這個例子我能看懂
: 跑 g[x_]:=Block[{w=10,xx=x},2xx+w]
: g[10] 會得到30。
: 但是例子中的 {ww,xx}和 {ww,xx}={ww,xx}
: : g[10]
: : {ww,xx}
: : g[10]=30
: : {ww,xx}={ww,xx}
: 是什麼意思呢?
ww,xx都是區域變數,所以跳出g以外那根本沒有被定義
所以還是只傳回ww,xx

: 不好意思問題蠻多的 ><
: 如果能抽空幫忙回答的話,我會非常感激的
: 感謝!


--
養花種魚數月亮賞星星

http://cydye1069.blogspot.com

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.173.130.58