2011-07-29 4 views
2

В каком-то коде, который я пишу, иногда я получаю тики значения как этогоКак лучше обрабатывать числовое форматирование клеща значения

Clear[z]; 
hz = z/(z^2 - 0.6 z + 0.18); 
tf = TransferFunctionModel[hz, z, SamplingPeriod -> 1]; 
p = BodePlot[tf, {0.01, 2 Pi}, 
    Frame -> False, PlotLayout -> "List", 
    ScalingFunctions -> {{"Linear", "Absolute"}, {"Linear", "Degree"}}][[1]]; 
Show[p] 

enter image description here

и это делает его трудно форматировать участок для учета это дополнительное пространство. Теперь я установил очень большое заполнение изображения, чтобы иметь достаточно места для этого дополнительного значения, и это пустое пространство.

btw Эта проблема влияет только на значения y в моем случае.

Я покажу, что я пытался решить. Но я не доволен ни метод, который я попробовал, и хотел бы спросить, если есть более простой способ решить эту проблему

Это то, что я пытался решить проблему

1) Используйте Ticks->fun, но это не работает, так как трудно получить тики, отформатированные вправо, так как значения y-графика Bode могут меняться в единицах в зависимости от предоставленных опций: от dB до Absolute до Log10 до Linear и для учета всех этих и получения тики справа не будут работать.

Clear[z]; 
fun[min_, max_] := 
Module[{}, 
    Join[Table[i, {i, Ceiling[min], Floor[max]}], 
    Table[j, {j, Round[min], Round[max - 1], 1}]]] 

hz = z/(z^2 + 0.5); 
tf = TransferFunctionModel[hz, z, SamplingPeriod -> 1]; 
p = BodePlot[tf, {0.01, 2 Pi}, Frame -> False, PlotLayout -> "List", 
    ScalingFunctions -> {{"Linear", "Absolute"}, {"Linear","Degree"}}, 
    Ticks -> fun][[1]]; 
Show[p] 

enter image description here

второе решение:

сделать сюжет первым, возьмите клещи, используйте NumberForm на них форматировать Y-значение, а затем сделать сюжет с новыми значениями клеща:

Clear[z]; 
hz = z/(z^2 - 0.6 z + 0.18); 
tf = TransferFunctionModel[hz, z, SamplingPeriod -> 1]; 
p = BodePlot[tf, {0.01, 2 Pi}, Frame -> False, PlotLayout -> "List", 
    ScalingFunctions -> {{"Linear", "Absolute"}, {"Linear", "Degree"}}][[1]]; 
ticks = Ticks /. AbsoluteOptions[p, Ticks]; 

ticks[[2, All, 1 ;; 2]] = 
    If[NumericQ[#[[2]]], {#[[1]], NumberForm[#[[2]], 3]}, #] & /@ 
    ticks[[2, All, 1 ;; 2]]; 

BodePlot[tf, {0.01, 2 Pi}, Frame -> False, PlotLayout -> "List", 
    ScalingFunctions -> {{"Linear", "Absolute"}, {"Linear", "Degree"}}, 
    Ticks -> {ticks, Automatic}][[1]] 

enter image description here

Вышеуказанный метод работает, но он медленный, так как мне нужно сделать BodePlot 2 раза, и я нахожу BodePlot немного медленнее, чем обычные сюжеты, поэтому я бы предпочел не делать этого, если нет другого более простого решение.

Может ли кто-нибудь увидеть более простое решение этой проблемы, может быть, один из них - экспертные трюки?

благодаря

Update 1:

Я использовал FindDivision [] дано в ответ ниже, как это, чтобы получить участок без проблем:

BodePlot[tf, {0.01, 2 Pi}, Frame -> False, PlotLayout -> "List", 
    Ticks -> {{FindDivisions[{0, 10}, 10], [email protected][{0, 2}, 10]},Automatic}, 
    ScalingFunctions -> {{"Linear", "Absolute"}, {"Linear", "Degree"}}][[1]] 

enter image description here

Но это на самом деле не помогает мне в этом случае, поскольку я не знаю, какие дивизии делать перед собой если я не сделаю вычисление значений передаточной функции в диапазоне частот, чтобы найти минимум и максимум, который заканчивается тем, что выполняет все вычисления дважды, чего я пытаюсь избежать.

FindDivisions будет работать хорошо, если вы знаете перед собой мин/макс диапазона участка.

Обновление 8/13/2001

Я получил ответ от ИМР на этом. Часть ответа:

Close Mathematica. Hold Control and Shift buttons while launching 
Mathematica. Keep holding the buttons down till Mathematica is fully up 
(the welcome screen shows up.) 

Try your plot again. How does this look ? 

После устранения проблемы проблема устранена! Сюжет теперь больше не показывает проблему, показанную в верхней части этой публикации.

Я не уверен, что вызвало проблему с файлами настроек, но по крайней мере сейчас, если появится новая проблема, вышеупомянутый трюк будет тем, что я попробую в первую очередь.

+0

Это, кажется, на самом деле быть система или зависит от версии. В моей системе (Mathematica 8) ваш первый сюжет отлично подходит для меня. –

+0

Это полезно знать. Это означает, что мне все равно придется делать это в любом случае, потому что я не уверен, в какой системе будет работать эта демоверсия. Я нахожусь на Windows XP, 64 бит, используя M 8.0.1 – Nasser

+0

Кстати, установка $ MinPrecision = $ MachinePrecision; $ MaxPrecision = $ MachinePrecision; не влияет на эти числовые значения. – Nasser

ответ

5

Errrr ....

В мма 8:

Clear[z]; 
hz = z/(z^2 - 0.6 z + 0.18); 
tf = TransferFunctionModel[hz, z, SamplingPeriod -> 1]; 
p = BodePlot[tf, {0.01, 2 Pi}, Frame -> False, PlotLayout -> "List", 
    ScalingFunctions -> {{"Linear", "Absolute"}, {"Linear", "Degree"}}][[1]]; 
Show[p] 

enter image description here

В мма 7 вы можете использовать FindDivisions[]:

p = BodePlot[tf, {0.01, 2 Pi}, 
    Frame -> False, PlotLayout -> "List", 
    Ticks -> {Automatic, FindDivisions[{0, 10}, {11, 10, 2}]}, 
    ScalingFunctions -> {{"Linear", "Absolute"}, {"Linear", "Degree"}}][[1]]; 
Show[p] 

Редактировать

Вы можете использовать AbsoluteOptions[] решить проблему в вашем Edit расчета участка только один раз:

p = BodePlot[tf, {0.01, 4 Pi}, 
      Frame -> False, PlotLayout -> "List", 
      ScalingFunctions -> {{"Linear", "Absolute"}, 
            {"Linear", "Degree" }}]; 

pr = (AbsoluteOptions[p, PlotRange] /. Rule[x_, y_] -> y); 

Show[[email protected], 
    Ticks -> {[email protected][pr[[1, 1, 1]],10], 
       [email protected][pr[[1, 1, 2]],10]} 
] 
+0

Гораздо лучший вариант. Я знал, что есть какая-то функция, которую я читал буквально в прошлый час. Это то, что вы хотите. –

+0

Я не понимаю ответа, потому что я получаю ту же проблему в своей версии Mathematica 8.0.1 на окнах 7, причем оба вышеуказанных фрагмента кода. Похоже, что это зависит от платформы. Btw, BodePlot только на версии 8. Это новая функция, а не версия 7. Спасибо. – Nasser

+0

Я использовал FindDivisions, чтобы установить тики вручную, см. Обновление 1 для результата. – Nasser

Смежные вопросы