绘制它的最佳方式
Best way to Plot it
我正在尝试绘制无限线性链的 DOS。通过以下方式:
s = 10; (*Number of decimation*)
t = 1;
step = 0.01;
SubStar[E] = w + I*\[Eta];
\[Eta] = 0.01;
\[Epsilon] = 0;
Subscript[\[Beta], 1] = t*1/(SubStar[E] - \[Epsilon])*t;
Subscript[\[Beta], 0] = 1;
For[j = 2, j < s + 1, j++,
Subscript[\[Beta], j] =
Subscript[\[Beta], j - 1]*1/(SubStar[E] - \[Epsilon] - 2 \!\(
\*SubsuperscriptBox[\(\[Sum]\), \(i = 1\), \(j - 1\)]
\*SubscriptBox[\(\[Beta]\), \(i\)]\))*Subscript[\[Beta], j - 1]];
Subscript[G, 1, 1] = 1/(SubStar[E] - \[Epsilon] - \!\(
\*SubsuperscriptBox[\(\[Sum]\), \(j = 1\), \(s\)]
\*SubscriptBox[\(\[Beta]\), \(j\)]\));
G22 = (1/(1 - Subscript[G, 1, 1]*Subscript[G, 1, 1]))*Subscript[G, 1,
1];
\[Rho] = -1/\[Pi]*Im[G22];
我想将 [Rho] 绘制为 w 的函数。
所以,如果我在开始时让 w 未定义(上面的代码)并绘制:
ListPlot[Table[{w, \[Rho]}, {w, -2.5, 2.5, step}], Joined -> True, Frame -> True]
它运行良好,但速度很慢,可能是因为 mathematica 正在以代数方式处理所有事情。
如果我改变 w,比如使用:w=Range[-2.5,2.5,step],那么我可以绘制这样的东西:
ListPlot[{\[Rho]}, Joined -> True, Frame -> True, PlotStyle -> Orange]
速度还是挺快的,但是横轴跟之前的Plot比起来不太行。
然后,我想做一些类似的事情,定义
\[Rho][w]:= Module[{.....},....]
并将其用作函数并在最后绘制。
有什么建议么?我应该怎么办?
Edit1:建议后:
Comparison between them
为什么不只是这个?
Plot[\[Rho], {w, -2.5, 2.5}, Frame -> True],
或更好
Plot[\[Rho], {w, -2.5, 2.5}, Frame -> True, PlotRange -> All]
也许在绘图之前尝试这个,但它看起来很耗时。
\[Rho] = Simplify[-1/\[Pi]*Im[G22]]
我试过了,很有趣...
For[j = 2, j < s + 1, j++,
Print[j];
Subscript[\[Beta], j] =
Simplify[Subscript[\[Beta],
j - 1]*1/(SubStar[E] - \[Epsilon] - 2 \!\(
\*SubsuperscriptBox[\(\[Sum]\), \(i = 1\), \(j - 1\)]
\*SubscriptBox[\(\[Beta]\), \(i\)]\))*Subscript[\[Beta], j - 1]]]
第十次迭代是杀手锏。它因以下消息而中止:-
我正在尝试绘制无限线性链的 DOS。通过以下方式:
s = 10; (*Number of decimation*)
t = 1;
step = 0.01;
SubStar[E] = w + I*\[Eta];
\[Eta] = 0.01;
\[Epsilon] = 0;
Subscript[\[Beta], 1] = t*1/(SubStar[E] - \[Epsilon])*t;
Subscript[\[Beta], 0] = 1;
For[j = 2, j < s + 1, j++,
Subscript[\[Beta], j] =
Subscript[\[Beta], j - 1]*1/(SubStar[E] - \[Epsilon] - 2 \!\(
\*SubsuperscriptBox[\(\[Sum]\), \(i = 1\), \(j - 1\)]
\*SubscriptBox[\(\[Beta]\), \(i\)]\))*Subscript[\[Beta], j - 1]];
Subscript[G, 1, 1] = 1/(SubStar[E] - \[Epsilon] - \!\(
\*SubsuperscriptBox[\(\[Sum]\), \(j = 1\), \(s\)]
\*SubscriptBox[\(\[Beta]\), \(j\)]\));
G22 = (1/(1 - Subscript[G, 1, 1]*Subscript[G, 1, 1]))*Subscript[G, 1,
1];
\[Rho] = -1/\[Pi]*Im[G22];
我想将 [Rho] 绘制为 w 的函数。
所以,如果我在开始时让 w 未定义(上面的代码)并绘制:
ListPlot[Table[{w, \[Rho]}, {w, -2.5, 2.5, step}], Joined -> True, Frame -> True]
它运行良好,但速度很慢,可能是因为 mathematica 正在以代数方式处理所有事情。
如果我改变 w,比如使用:w=Range[-2.5,2.5,step],那么我可以绘制这样的东西:
ListPlot[{\[Rho]}, Joined -> True, Frame -> True, PlotStyle -> Orange]
速度还是挺快的,但是横轴跟之前的Plot比起来不太行。
然后,我想做一些类似的事情,定义
\[Rho][w]:= Module[{.....},....]
并将其用作函数并在最后绘制。 有什么建议么?我应该怎么办?
Edit1:建议后:
Comparison between them
为什么不只是这个?
Plot[\[Rho], {w, -2.5, 2.5}, Frame -> True],
或更好
Plot[\[Rho], {w, -2.5, 2.5}, Frame -> True, PlotRange -> All]
也许在绘图之前尝试这个,但它看起来很耗时。
\[Rho] = Simplify[-1/\[Pi]*Im[G22]]
我试过了,很有趣...
For[j = 2, j < s + 1, j++,
Print[j];
Subscript[\[Beta], j] =
Simplify[Subscript[\[Beta],
j - 1]*1/(SubStar[E] - \[Epsilon] - 2 \!\(
\*SubsuperscriptBox[\(\[Sum]\), \(i = 1\), \(j - 1\)]
\*SubscriptBox[\(\[Beta]\), \(i\)]\))*Subscript[\[Beta], j - 1]]]
第十次迭代是杀手锏。它因以下消息而中止:-