Я пытаюсь построить графикРамберг-Осгуд-отношениядля конкретного материала с pgfplots. Соотношение описывает кривую напряжение-деформация, то есть напряжение как функцию деформации. Само соотношение определяется как деформация как функция напряжения:
strain(stress)=stress/modulus+0.002*(stress/yield stress)^n
Я уже нашелнитькоторый описывает построение графиков обратных функций, то есть построение графика x как функции y.
Однако все, что я пробовал, приводило к ошибке, либоРазмер слишком большойот TikZ,Недопустимая единица измеренияс fpu как вэта темаили неправильная функция в gnuplot.
Вот MWE для тех вещей, которые я попробовал:
Простые графики pgfplot:
\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}
Результаты в:
! Dimension too large.
<to be read again>
\relax
l.21 \pgfmathsetmacro\modulus{72400}
pgfplots с 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}
Результаты в:
! Illegal unit of measure (pt inserted).
pgfplots с 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}
Выдает мне результат, который явно неверный.
Редактировать
Я также пробовал использовать ГПа в качестве единицы измерения напряжения, но мне хотелось бы настроить диаграмму в системе МПа, поскольку в остальной части моего документа она используется.
\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}
Редактировать2
Благодаря ответу @Christian, есть текущая версия графика. Однако я обнаружил, что мне нужно определить напряжения, а значит и ось x, не в процентах, а в фактическом десятичном значении, чтобы получить правильный график.
\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}
И снова проблема в том, что я получаю ошибку.
! Dimension too large.
для второго addplot, но только если показатель степени > 10. Значение становится слишком маленьким?
Может ли кто-нибудь объяснить, как правильно настроить эту диаграмму?
решение1
Как уже объяснялось в каком-то комментарии, \pgfmathsetmacro{72400}
PGF не поддерживает его (на самом деле моя система принимает его без проблем - видимо, что-то изменилось в PGF CVS).
Тем не менее, вам не нужно \pgfmathsetmacro
просто объявлять константу; гораздо проще написать ее \def\MACRO{<constant>}
(или использовать \newcommand\MACRO{<constant>}
, что одно и то же).
Затем вам нужно назначить domain
. Ключ(и) restrict * to domain
не определяют, как делать выборку точек; их можно использовать для исключения уже выбранных точек из интересующей области. В вашем случае вы бы определили domain=775
и опустили restrict * to domain
.
Наконец, математические выражения в параметрических графиках нуждаются в дополнительных фигурных скобках, если они содержат другие круглые скобки. Другими словами, используйте , ({x/\modulus+0.002*(x/\yield)^15},x)
чтобы избежать путаницы с круглыми скобками (TeX не может автоматически их балансировать, он может балансировать только фигурные скобки).
Обобщая все вышесказанное, я прихожу к следующей модификации вашего первого сюжета:
\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}
решение2
Вот что сработало у меня в TeX Live 2013:
\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}
решение3
(Частично решено.) Я нарисовал почти идеальную прямую линию без существенного изменения пересечения с осью Y! Даже эти значения выглядят подозрительно...
Ну, я не знаю точно, как задать параметры для этой конкретной задачи, но я не был ограничен в вычислениях, так как Lua был на ходу. Возможно, будет полезно знать этот способ для подобных задач в долгосрочной перспективе. Lua можно даже улучшить с помощью библиотек BigNum и BigRat,http://oss.digirati.com.br/luabignum/. Меня вдохновила эта статья,http://www.unirioja.es/cu/jvarona/downloads/numerical-methods-luatex.pdf, чтобы попробовать эту задачу независимо от результатов. В качестве упражнения я также перечислил координаты в качестве немедленной обратной связи, если результаты будут такими, какими они должны быть.
%! 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}