wp = 1; c = 1;
Omega[V_] := w - k*V;
Arel[V_] := (w - k*V)^2*(w^2 - k^2*c^2 - wp^2*gam[V]^2) -
wc^2*(w^2 - k^2*c^2);
Brel[V_] :=
1/c^2*((w - k*V)^2*(w^2 - k^2*c^2 - wp^2*gam[V]^2)^2 -
wc^2*(w^2 - k^2*c^2)^2);
gam[V_] := 1/Sqrt[1 - V^2/c^2];
grel[B0_, k1_,
V0_] := (wc = wp*B0;
k = k1*wp/V0; (w /.
NSolve[{w*(wc^2 + wp^2 - Omega[V0]^2)*(a1^2*A1) +
w/c^2 (wp^2/Omega[V0]^2 - 1)*Arel[V0]*
A1 - (wc*wp^2*gam[V0]^2)*(k - w*V0/c^2)*a1*C1 == 0,
w*(wc^2 + wp^2 - Omega[V0]^2)*(b1^2*B1) +
w/c^2 (wp^2/Omega[V0]^2 - 1)*Arel[V0]*
B1 - (wc*wp^2*gam[V0]^2)*(k - w*V0/c^2)*b1*D1 == 0,
w*(wc^2 + wp^2 - Omega[-V0]^2)*(a2^2*A2) +
w/c^2 (wp^2/Omega[-V0]^2 - 1)*Arel[-V0]*
A2 - (wc*wp^2*gam[V0]^2)*(k + w*V0/c^2)*a2*C2 == 0,
w*(wc^2 + wp^2 - Omega[-V0]^2)*(b2^2*B2) +
w/c^2 (wp^2/Omega[-V0]^2 - 1)*Arel[-V0]*
B2 - (wc*wp^2*gam[V0]^2)*(k + w*V0/c^2)*b2*D2 == 0,
Arel[V0]*(a1^2*C1) +
Brel[V0]*C1 - (w*wc*wp^2*gam[V0]^2)*(k - w*V0/c^2)*a1*A1 ==
0,
Arel[V0]*(b1^2*D1) +
Brel[V0]*D1 - (w*wc*wp^2*gam[V0]^2)*(k - w*V0/c^2)*b1*B1 ==
0,
Arel[-V0]*(a2^2*C2) +
Brel[-V0]*C2 - (w*wc*wp^2*gam[V0]^2)*(k + w*V0/c^2)*a2*A2 ==
0,
Arel[-V0]*(b2^2*D2) +
Brel[-V0]*D2 - (w*wc*wp^2*gam[V0]^2)*(k + w*V0/c^2)*b2*B2 ==
0,
A1 + B1 == 1, A2 + B2 == 1, C1 + D1 == C2 + D2,
a1*C1 + b1*D1 == a2*C2 + b2*D2,
w/Arel[V0]*(wc^2 + wp^2 - Omega[V0]^2)*(a1*A1 + b1*B1) - (wc*
wp^2*gam[V0]^2)*(k - w*V0/c^2)/Arel[V0]*(C1 + D1) ==
w/Arel[-V0]*(wc^2 + wp^2 - Omega[-V0]^2)*(a2*A2 +
b2*B2) - (wc*wp^2*gam[V0]^2)*(k + w*V0/c^2)/
Arel[-V0]*(C2 + D2), Re[a1] < 0, Re[b1] <= Re[a1],
Re[a2] > 0, Re[b2] >= Re[a2], Im[w] > 0, Re[w] <= 0}]) //
Union) /. {Union[w] -> 0} // First[MaximalBy[#, Abs@*Im]] &
这段代码用来求解某个特征方程。我使用了形如(*
SuperPlus[Ey] = A1*exp (a1*x) + B1*exp (b1*x),
SuperMinus[Ey] = A2*exp (a2*x) + B2*exp (b2*x),
SuperPlus[Ez] = C1*exp (a1*x) + D1*exp (b1*x),
SuperMinus[Ez] = C2*exp (a2*x) + D2*exp (b2*x),
*)
的猜测解,最终把这个特征方程变成了上面的多项式方程,并用NSolve求解。grel函数最终会返回一个最大的本征值。我的代码确实可以达成我的目标,但是耗时非常长。
有一点是,NSolve会给出很多组重复的解。但是由于NSolve中会给出很多不同的本征值,而我需要其中最大的那个,所以我又不能用MaxRoots->1.有没有什么办法来避免重复求解呢?
另外一方面,尽管我知道w的猜测值,但我对于其他参数一无所知,因此Findroot似乎也不使适用(至少我不太清楚该怎么用)
各位神通广大的吧友有什么好的看法呢?
Omega[V_] := w - k*V;
Arel[V_] := (w - k*V)^2*(w^2 - k^2*c^2 - wp^2*gam[V]^2) -
wc^2*(w^2 - k^2*c^2);
Brel[V_] :=
1/c^2*((w - k*V)^2*(w^2 - k^2*c^2 - wp^2*gam[V]^2)^2 -
wc^2*(w^2 - k^2*c^2)^2);
gam[V_] := 1/Sqrt[1 - V^2/c^2];
grel[B0_, k1_,
V0_] := (wc = wp*B0;
k = k1*wp/V0; (w /.
NSolve[{w*(wc^2 + wp^2 - Omega[V0]^2)*(a1^2*A1) +
w/c^2 (wp^2/Omega[V0]^2 - 1)*Arel[V0]*
A1 - (wc*wp^2*gam[V0]^2)*(k - w*V0/c^2)*a1*C1 == 0,
w*(wc^2 + wp^2 - Omega[V0]^2)*(b1^2*B1) +
w/c^2 (wp^2/Omega[V0]^2 - 1)*Arel[V0]*
B1 - (wc*wp^2*gam[V0]^2)*(k - w*V0/c^2)*b1*D1 == 0,
w*(wc^2 + wp^2 - Omega[-V0]^2)*(a2^2*A2) +
w/c^2 (wp^2/Omega[-V0]^2 - 1)*Arel[-V0]*
A2 - (wc*wp^2*gam[V0]^2)*(k + w*V0/c^2)*a2*C2 == 0,
w*(wc^2 + wp^2 - Omega[-V0]^2)*(b2^2*B2) +
w/c^2 (wp^2/Omega[-V0]^2 - 1)*Arel[-V0]*
B2 - (wc*wp^2*gam[V0]^2)*(k + w*V0/c^2)*b2*D2 == 0,
Arel[V0]*(a1^2*C1) +
Brel[V0]*C1 - (w*wc*wp^2*gam[V0]^2)*(k - w*V0/c^2)*a1*A1 ==
0,
Arel[V0]*(b1^2*D1) +
Brel[V0]*D1 - (w*wc*wp^2*gam[V0]^2)*(k - w*V0/c^2)*b1*B1 ==
0,
Arel[-V0]*(a2^2*C2) +
Brel[-V0]*C2 - (w*wc*wp^2*gam[V0]^2)*(k + w*V0/c^2)*a2*A2 ==
0,
Arel[-V0]*(b2^2*D2) +
Brel[-V0]*D2 - (w*wc*wp^2*gam[V0]^2)*(k + w*V0/c^2)*b2*B2 ==
0,
A1 + B1 == 1, A2 + B2 == 1, C1 + D1 == C2 + D2,
a1*C1 + b1*D1 == a2*C2 + b2*D2,
w/Arel[V0]*(wc^2 + wp^2 - Omega[V0]^2)*(a1*A1 + b1*B1) - (wc*
wp^2*gam[V0]^2)*(k - w*V0/c^2)/Arel[V0]*(C1 + D1) ==
w/Arel[-V0]*(wc^2 + wp^2 - Omega[-V0]^2)*(a2*A2 +
b2*B2) - (wc*wp^2*gam[V0]^2)*(k + w*V0/c^2)/
Arel[-V0]*(C2 + D2), Re[a1] < 0, Re[b1] <= Re[a1],
Re[a2] > 0, Re[b2] >= Re[a2], Im[w] > 0, Re[w] <= 0}]) //
Union) /. {Union[w] -> 0} // First[MaximalBy[#, Abs@*Im]] &
这段代码用来求解某个特征方程。我使用了形如(*
SuperPlus[Ey] = A1*exp (a1*x) + B1*exp (b1*x),
SuperMinus[Ey] = A2*exp (a2*x) + B2*exp (b2*x),
SuperPlus[Ez] = C1*exp (a1*x) + D1*exp (b1*x),
SuperMinus[Ez] = C2*exp (a2*x) + D2*exp (b2*x),
*)
的猜测解,最终把这个特征方程变成了上面的多项式方程,并用NSolve求解。grel函数最终会返回一个最大的本征值。我的代码确实可以达成我的目标,但是耗时非常长。
有一点是,NSolve会给出很多组重复的解。但是由于NSolve中会给出很多不同的本征值,而我需要其中最大的那个,所以我又不能用MaxRoots->1.有没有什么办法来避免重复求解呢?
另外一方面,尽管我知道w的猜测值,但我对于其他参数一无所知,因此Findroot似乎也不使适用(至少我不太清楚该怎么用)
各位神通广大的吧友有什么好的看法呢?