1

This question is a continuation of a similar one.

My task is to draw two hysteresis loops in one graph. I took the function (which represents my hysteresis loops) from here.

My code:

\documentclass{scrartcl}
\usepackage{tikz}
\usepackage[per-mode = fraction]{siunitx}
\usetikzlibrary{datavisualization.formats.functions}
\begin{document}
  \begin{tikzpicture}
    \datavisualization[
                       scientific axes = {clean, end labels},
                       all axes = {ticks and grid = {major at = 0}},
                       x axis = {label = $\frac{H}{\si{\A\per\m}}$},
                       y axis = {label = $\frac{B(H)}{\si{\tesla}}$},
                       data/format = function,
                       visualize as smooth line/.list = {left_soft, right_soft, left_hard, right_hard},
                       left_soft = {style = dashed,
                                    label in legend = {text = weichmagnetisch}
                                   },
                       right_soft = {style = dashed},
                       left_hard = {label in legend = {text = hartmagnetisch}}
                      ]
    data[set = left_soft] {
                           var x : interval [-7 : 7];
                           func y = 5 / (1 + exp(-2 * \value x - 1.5)) - 2.5;
                          }
    data[set = right_soft] {
                            var x : interval [-7 : 7];
                            func y = 5 / (1 + exp(-2 * \value x + 1.5)) - 2.5;
                           }
    data[set = left_hard] {
                           var x : interval [-7 : 7];
                           func y = 5 / (1 + exp(-.75 * \value x - 1.5)) - 2.5;
                          }
    data[set = right_hard] {
                            var x : interval [-7 : 7];
                            func y = 5 / (1 + exp(-.75 * \value x + 1.5)) - 2.5;
                           };
  \end{tikzpicture}
\end{document}

However I get many

! Dimension too large. \pgfmath@iterate ...\pgfmath@xa \ifdim \pgfmath@x

errors. How can I fix it?

Thank you for your help in advance!

3

The evaluation of exp(-2 * \value x - 1.5) for x=-6 and x=-7, and likewise of exp(-2 * \value x + 1.5) for x=-5,-6,-7 results in an overflow. The easiest fix is to omit these values since this part of the graph is covered by the other curves anyway. Otherwise you can define the function piece-wise by setting it to zero for the bad values of x.

enter image description here

\documentclass{scrartcl}
\usepackage{tikz}
\usepackage[per-mode = fraction]{siunitx}
\usetikzlibrary{datavisualization.formats.functions}
\begin{document}
  \begin{tikzpicture}
    \datavisualization[
                       scientific axes = {clean, end labels},
                       all axes = {ticks and grid = {major at = 0}},
                       x axis = {label = $\frac{H}{\si{\A\per\m}}$},
                       y axis = {label = $\frac{B(H)}{\si{\tesla}}$},
                       data/format = function,
                       visualize as smooth line/.list = {left_soft, right_soft, left_hard, right_hard},
                       left_soft = {style = dashed,
                                    label in legend = {text = weichmagnetisch}
                                   },
                       right_soft = {style = dashed},
                       left_hard = {label in legend = {text = hartmagnetisch}}
                      ]
    data[set = left_soft] {
                           var x : interval [-5 : 7];
                           func y = 5 / (1 + exp(-2 * \value x - 1.5)) - 2.5;
                          }
    data[set = right_soft] {
                            var x : interval [-4 : 7];
                            func y = 5 / (1 + exp(-2 * \value x + 1.5)) - 2.5;
                          }
    data[set = left_hard] {
                           var x : interval [-7 : 7];
                           func y = 5 / (1 + exp(-.75 * \value x - 1.5)) - 2.5;
                          }
    data[set = right_hard] {
                            var x : interval [-7 : 7];
                            func y = 5 / (1 + exp(-.75 * \value x + 1.5)) - 2.5;
                           }
;
  \end{tikzpicture}
\end{document}
| improve this answer | |
  • Hello @gernot! Thank you for your answer! If I understand correctly there is no general solution (like fpu) for this task? – Su-47 Feb 16 '17 at 12:21
  • @Su-47 Sorry, I have no experience with fpu. It may well be that the calculations can be done with a higher precision/bigger range. – gernot Feb 16 '17 at 12:24

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.