pgfplots: Inverse Funktion darstellen (Funktion von y)

pgfplots: Inverse Funktion darstellen (Funktion von y)

Ich versuche, dieRamberg-Osgood-Beziehungfür ein bestimmtes Material mit pgfplots. Die Beziehung beschreibt die Spannungs-Dehnungs-Kurve, also die Spannung als Funktion der Dehnung. Die Beziehung selbst wird als Dehnung als Funktion der Spannung definiert:

strain(stress)=stress/modulus+0.002*(stress/yield stress)^n

Ich habe bereits eineFadenDarin wird das Zeichnen inverser Funktionen beschrieben, also das Zeichnen von x als Funktion von y.

Aber alles, was ich versucht habe, führt zu einem Fehler, entwederDimension zu großvon TikZ,Unzulässige Maßeinheitmit fpu wie indieser Threadoder die falsche Funktion mit Gnuplot.

Hier sind die MWEs für die Dinge, die ich ausprobiert habe:

  • Einfache pgfplots:

    \documentclass{standalone}
    \usepackage{pgfplots}
    \usepackage{siunitx}
    
    \pgfplotsset{compat=1.10}
    
    \begin{document}
    
    \pgfplotsset{stressstrainset/.style={%
    axis lines=center,
    xlabel={$\varepsilon$ $\left[\si{\percent}\right]$},
    ylabel={$\sigma$ $\left[\si{\MPa}\right]$},
    restrict x to domain=0:15,
    restrict y to domain=0:775,
    xmin=0.0, xmax=  15,
    ymin=0.0, ymax= 775,
    samples=100,
    }}
    
    \begin{tikzpicture}
    \pgfmathsetmacro\modulus{72400}
    \pgfmathsetmacro\yield{325}
    \begin{axis}[stressstrainset]
    \addplot[black] (x/\modulus+0.002*(x/\yield)^15,x);
    \end{axis}
    \end{tikzpicture}
    
    \end{document}
    

Ergebnisse in:

! Dimension too large.
<to be read again> 
\relax 
l.21 \pgfmathsetmacro\modulus{72400}
  • pgfplots mit fpu:

    \documentclass{standalone}
    \usepackage{pgfplots}
    \usepackage{siunitx}
    
    \pgfplotsset{compat=1.10}
    
    \begin{document}
    
    \pgfplotsset{stressstrainset/.style={%
    axis lines=center,
    xlabel={$\varepsilon$ $\left[\si{\percent}\right]$},
    ylabel={$\sigma$ $\left[\si{\MPa}\right]$},
    restrict x to domain=0:15,
    restrict y to domain=0:775,
    xmin=0.0, xmax=  15,
    ymin=0.0, ymax= 775,
    samples=100,
    }}
    
    \begin{tikzpicture}
    \pgfkeys{/pgf/fpu=true}
    \pgfmathsetmacro\modulus{72400}
    \pgfkeys{/pgf/fpu=false}
    \pgfmathsetmacro\yield{325}
    \begin{axis}[stressstrainset]
    \addplot[black] (x/\modulus+0.002*(x/\yield)^15,x);
    \end{axis}
    \end{tikzpicture}
    
    \end{document}
    

Ergebnisse in:

! Illegal unit of measure (pt inserted).
  • pgfplots mit gnuplot:

    \documentclass{standalone}
    \usepackage{pgfplots}
    \usepackage{siunitx}
    
    \pgfplotsset{compat=1.10}
    
    \begin{document}
    
    \pgfplotsset{stressstrainset/.style={%
    axis lines=center,
    xlabel={$\varepsilon$ $\left[\si{\percent}\right]$},
    ylabel={$\sigma$ $\left[\si{\MPa}\right]$},
    restrict x to domain=0:15,
    restrict y to domain=0:775,
    xmin=0.0, xmax=  15,
    ymin=0.0, ymax= 775,
    samples=100,
    }}
    
    \begin{tikzpicture}
    \begin{axis}[stressstrainset]
    \addplot gnuplot [raw gnuplot,id=nfive, mark=none, draw=black]{
    set xrange  [0:15];
    modulus = 72400;
    yield   = 325;
    h(x)=(x/modulus+0.002*(x/yield)^15);
    plot h(x),x
    };
    \end{axis}
    \end{tikzpicture}
    
    \end{document}
    

Gibt mir ein Ergebnis, das offensichtlich falsch ist.

Bearbeiten

Ich habe auch versucht, GPa als Einheit für die Spannung zu verwenden, aber ich möchte das Diagramm im MPa-System einrichten, da der Rest meines Dokuments dieses verwendet.

\documentclass{standalone}
\usepackage{pgfplots}
\usepackage{siunitx}

\pgfplotsset{compat=1.10}

\begin{document}

\pgfplotsset{stressstrainset/.style={%
axis lines=center,
xlabel={$\varepsilon$ $\left[-\right]$},
ylabel={$\sigma$ $\left[\si{\GPa}\right]$},
restrict x to domain=0:0.15,
restrict y to domain=0:0.775,
xmin=0.0, xmax=  0.15,
ymin=0.0, ymax= 0.775,
samples=1000,
}}

\begin{tikzpicture}
\pgfmathsetmacro\modulus{72.400}
\pgfmathsetmacro\yield{0.325}
\begin{axis}[stressstrainset]
\addplot[black] (x/\modulus+0.002*(x/\yield)^15,x);
\end{axis}
\end{tikzpicture}

\end{document}

Bearbeiten

Dank @Christians Antwort gibt es eine laufende Version des Diagramms. Allerdings habe ich herausgefunden, dass ich die Dehnungen, also die x-Achse, nicht in Prozent, sondern in den tatsächlichen Dezimalwerten angeben muss, um das richtige Diagramm zu erhalten.

\documentclass{standalone}
\usepackage{pgfplots}
\usepackage{siunitx}

\pgfplotsset{compat=1.10}

\begin{document}

\pgfplotsset{stressstrainset/.style={%
axis lines=center,
xlabel={$\varepsilon$ $\left[-\right]$},
ylabel={$\sigma$ $\left[\si{\MPa}\right]$},
domain=0:775,
xmin=0.0, xmax= 0.15,
ymin=0.0, ymax= 775,
samples=100,
}}

\begin{tikzpicture}
\def\modulus{72400}
\def\yield{325}
\begin{axis}[stressstrainset]
\addplot[gray, dashed] ({x/\modulus},x);
\addplot[black] ({x/\modulus+0.002*(x/\yield)^15},x);
\end{axis}
\end{tikzpicture}

Jetzt gibt es wieder das Problem, dass ich den Fehler bekomme

! Dimension too large.

für das zweite Addplot, aber nur wenn der Exponent >10 ist. Wird der Wert zu klein?

Kann mir bitte jemand erklären, wie ich dieses Diagramm richtig einrichte?

Antwort1

Wie bereits in einigen Kommentaren erläutert, \pgfmathsetmacro{72400}wird es von PGF nicht unterstützt (tatsächlich akzeptiert mein System es ohne Probleme – anscheinend hat sich in PGF CVS etwas geändert).

Sie müssen jedoch nicht \pgfmathsetmacroeinfach eine Konstante deklarieren. Das Schreiben \def\MACRO{<constant>}(oder Verwenden \newcommand\MACRO{<constant>}, was dasselbe sein sollte) ist viel einfacher.

Dann müssen Sie einen zuweisen domain. Die Schlüssel restrict * to domainsind keine Definition, wie Punkte abgetastet werden; sie können verwendet werden, um bereits abgetastete Punkte aus dem Interessenbereich auszuschließen. In Ihrem Fall würden Sie domain=775den definieren und weglassen restrict * to domain.

Schließlich benötigen mathematische Ausdrücke in parametrischen Diagrammen zusätzliche geschweifte Klammern, wenn sie andere runde Klammern enthalten. Mit anderen Worten: Verwenden Sie diese, ({x/\modulus+0.002*(x/\yield)^15},x)um Verwechslungen mit den runden Klammern zu vermeiden (TeX kann sie nicht automatisch ausgleichen, es kann nur geschweifte Klammern ausgleichen).

Zusammenfassend komme ich zu folgender Modifikation Ihres ersten Plots:

\documentclass{standalone}
\usepackage{pgfplots}

\pgfplotsset{compat=1.10}

\begin{document}

\pgfplotsset{stressstrainset/.style={%
axis lines=center,
xlabel={$\varepsilon$},
ylabel={$\sigma$},
%restrict x to domain=0:15,
domain=0:775,
xmin=0.0, xmax=  15,
ymin=0.0, ymax= 775,
samples=100,
}}

\begin{tikzpicture}
\def\modulus{72400}
\def\yield{325}
\begin{axis}[stressstrainset]
\addplot[black] ({x/\modulus+0.002*(x/\yield)^15},x);
\end{axis}
\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

Antwort2

Folgendes hat bei mir bei TeX Live 2013 funktioniert:

\documentclass{standalone}
\usepackage{pgfplots}
\usepackage{siunitx}

\begin{document}

\pgfplotsset{stressstrainset/.style={%
axis lines=center,
xlabel={$\varepsilon$ $\left[\si{\percent}\right]$},
ylabel={$\sigma$ $\left[\si{\MPa}\right]$},
restrict x to domain=0:15,
restrict y to domain=0:0.775, % GPa
xmin=0.0, xmax=  15,
ymin=0.0, ymax= 0.775, % GPa
samples=1000,
%scaled y ticks=false,
yticklabels={0, 0, 200, 400, 600} % MPa
}}

\begin{tikzpicture}
\pgfmathsetmacro\modulus{72.400} % GPa
\pgfmathsetmacro\yield{0.325} % GPa
\begin{axis}[stressstrainset]
\addplot[black] (x/\modulus+0.002*(x/\yield)^15,x);
\end{axis}
\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

Antwort3

(Teilweise gelöst.) Ich habe eine fast perfekte gerade Linie ohne nennenswerte Änderung des y-Achsenabschnitts gezeichnet! Sogar diese Werte sehen verdächtig aus ...

Nun, ich weiß nicht genau, wie ich die Parameter für diese spezielle Aufgabe einstellen soll, aber ich war in meinen Berechnungen nicht eingeschränkt, da Lua auf der Strecke war. Es könnte für ähnliche Aufgaben auf lange Sicht nützlich sein, diesen Weg zu kennen. Lua kann durch die Bibliotheken BigNum und BigRat sogar noch verbessert werden.http://oss.digirati.com.br/luabignum/. Ich wurde von diesem Artikel inspiriert,http://www.unirioja.es/cu/jvarona/downloads/numerical-methods-luatex.pdf, diese Aufgabe unabhängig vom Ergebnis zu versuchen. Als Übung habe ich auch die Koordinaten aufgelistet, um sofort zu erfahren, ob die Ergebnisse so sind, wie sie sein sollten.

%! lualatex inverse.tex
\documentclass[a4paper]{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\usepackage{siunitx}
\usepackage{luacode}
\parindent=0pt
\pagestyle{empty}

\begin{document}
\def\myxmin{0}
\def\myxmax{15}
\def\mysamples{100}
\def\mymodulus{72400} % /1000?
\def\myyield{325} % /1000?

\pgfplotsset{stressstrainset/.style={%
  axis lines=center,
  xlabel={Strain $\varepsilon$ $\left[\si{\percent}\right]$},
  ylabel={Stress $\sigma$ $\left[\si{\MPa}\right]$},
  restrict x to domain=0:\myxmax,
  restrict y to domain=0:775, % /1000?
  xmin=\myxmin, xmax=\myxmax,
  ymin=0.0, ymax=775, % /1000?
  samples=\mysamples,
  }}

\begin{luacode*}
-- Round me...
-- http://lua-users.org/wiki/SimpleRound
function round(num, idp)
  local mult=10^(idp or 0)
  return math.floor(num*mult+0.5)/mult
end

-- Compute me...
function computeme(xmin,xmax,samples,modulus,yield)
  local step=(xmax-xmin)/(samples-1)
  local x=xmin
  local y
  local mystring=""
  tex.sprint("\\begin{tikzpicture}")
  tex.sprint("\\begin{axis}[stressstrainset])")
  tex.sprint("\\addplot[black] coordinates {")
  for i=1,samples do
    y=1000000*(x/modulus+0.002*(x/yield)^15)
    mystring=mystring.."("..round(x,2)..","..round(y,2)..") "
    x=x+step
  end
tex.sprint(mystring) -- values in the graph
tex.sprint("};")
tex.sprint("\\end{axis}")
tex.sprint("\\end{tikzpicture}\\par")
tex.sprint(mystring) -- paper
end
\end{luacode*}

% Draw and show me...
\directlua{computeme(\myxmin, \myxmax, \mysamples, \mymodulus, \myyield)}
\end{document}

MWE

verwandte Informationen