Как построить график функции `x^2+xy+2` с помощью `PGFPlots`

Как построить график функции `x^2+xy+2` с помощью `PGFPlots`

Я хотел бы построить z=x^2+xy+2.

Вот что я хочу:

Что я хочу

Однако я не могу сделать поверхность красивее.

МВЭ:

\documentclass{article}
\usepackage[a4paper,margin=1in,footskip=0.25in]{geometry}

\usepackage{pgfplots}
\pgfplotsset{compat=1.15}
\pgfplotsset{soldot/.style={color=black,only marks,mark=*}}

\begin{document}

\begin{center}
    \begin{tikzpicture}[declare function={f(\x,\y)=\x*\x+\x*\y+2;}]
        \begin{axis} [
                axis on top,
                axis lines=center,
                xlabel=$x$,
                ylabel=$y$,
                zlabel=$z$,
                ticklabel style={font=\tiny},
                legend pos=outer north east,
                legend style={cells={align=left}},
                legend cell align={left},
                view={135}{25}
            ]
            \addplot3[surf,domain=0:10,domain y=0:5,restrict z to domain=0:6,samples=61,samples y=61] {x*x+x*y+2};
            \addlegendentry{\(z=x^2+xy+2\)}
            \addplot3[red,thick,variable=\t,domain=-1:3,samples y=0] ({1+4*t},{2+t},{5-t});
            \addlegendentry{\(r\)}
            \addplot3[green,thick,variable=\t,domain=-1:2,samples y=0] ({4+5*t},{-2+6*t},{3});
            \addlegendentry{\(\vec X\)}
            \addplot3[soldot] coordinates {(1,2,5)} node[above right] {$A$};
            \addplot3[soldot] coordinates {(9,4,3)} node[left] {$r\cap\vec X$};
        \end{axis}
    \end{tikzpicture}
\end{center}

\end{document}

Выход МВЭ

РЕДАКТИРОВАТЬ.Благодаряполезный комментарий суркаЯ мог бы сделать это лучше:

\documentclass{article}
\usepackage[a4paper,margin=1in,footskip=0.25in]{geometry}

\usepackage{pgfplots}
\pgfplotsset{compat=1.15}
\pgfplotsset{soldot/.style={color=black,only marks,mark=*}}
\begin{document}

\begin{center}
    \begin{tikzpicture}[declare function={f(\x,\y)=\x*\x+\x*\y+2;}]
        \begin{axis} [
                axis on top,
                axis lines=center,
                xlabel=$x$,
                ylabel=$y$,
                zlabel=$z$,
                zmax=6,
                ticklabel style={font=\tiny},
                legend pos=outer north east,
                legend style={cells={align=left}},
                legend cell align={left},
                view={135}{25}
            ]
            \addplot3[surf,domain=-5:10,domain y=-3:5,samples=61,samples y=61,z buffer=sort] {x*x+x*y+2};
            \addlegendentry{\(z=x^2+xy+2\)}
            \addplot3[red,thick,variable=\t,domain=-1:3,samples y=0] ({1+4*t},{2+t},{5-t});
            \addlegendentry{\(r\)}
            \addplot3[green,thick,variable=\t,domain=-1:2,samples y=0] ({4+5*t},{-2+6*t},{3});
            \addlegendentry{\(\vec X\)}
            \addplot3[soldot] coordinates {(1,2,5)} node[above right] {$A$};
            \addplot3[soldot] coordinates {(9,4,3)} node[left] {$r\cap\vec X$};
        \end{axis}
    \end{tikzpicture}
\end{center}

\end{document}

Улучшенный сюжет

Однако,Я бы хотел, чтобы графика имела цветовую палитру(полностью синий цвет не совсем подходит).

Спасибо!!

решение1

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

\documentclass{article}
\usepackage[a4paper,margin=1in,footskip=0.25in]{geometry}

\usepackage{pgfplots}
\pgfplotsset{compat=1.15}
\pgfplotsset{soldot/.style={color=black,only marks,mark=*}}
\begin{document}

\begin{center}
    \begin{tikzpicture}[declare function={f(\x,\y)=\x*\x+\x*\y+2;}]
        \begin{axis} [
                axis on top,
                axis lines=center,
                xlabel=$x$,
                ylabel=$y$,
                zlabel=$z$,
                zmax=6,
                ticklabel style={font=\tiny},
                legend pos=outer north east,
                legend style={cells={align=left}},
                legend cell align={left},
                view={135}{25}
            ]
%             \addplot3[surf,domain=-5:10,domain y=-3:5,samples=21,samples y=21,z buffer=sort] 
%           {x*x+x*y+2};
            \addplot3[surf,domain=-5:5,domain y=-5:5,samples=61,samples y=61,z
            buffer=sort,point meta=z] 
            ({cos(22.5)*x-sin(22.5)*y},{cos(22.5)*y+sin(22.5)*x},{(4 + (1 + sqrt(2))*x*x - (-1 + sqrt(2))*y*y)/2});         

            \addlegendentry{\(z=x^2+xy+2\)}
            \addplot3[red,thick,variable=\t,domain=-1:3,samples y=0] ({1+4*t},{2+t},{5-t});
            \addlegendentry{\(r\)}
            \addplot3[green,thick,variable=\t,domain=-1:2,samples y=0] ({4+5*t},{-2+6*t},{3});
            \addlegendentry{\(\vec X\)}
            \addplot3[soldot] coordinates {(1,2,5)} node[above right] {$A$};
            \addplot3[soldot] coordinates {(9,4,3)} node[left] {$r\cap\vec X$};
        \end{axis}
    \end{tikzpicture}
\end{center}

\end{document}

введите описание изображения здесь

Скрытие скрытой части красной линии:

\documentclass{article}
\usepackage[a4paper,margin=1in,footskip=0.25in]{geometry}

\usepackage{pgfplots}
\pgfplotsset{compat=1.15}
\pgfplotsset{soldot/.style={color=black,only marks,mark=*}}
\begin{document}

\begin{center}
    \begin{tikzpicture}[declare function={f(\x,\y)=\x*\x+\x*\y+2;}]
        \begin{axis} [
                axis on top,
                axis lines=center,
                xlabel=$x$,
                ylabel=$y$,
                zlabel=$z$,
                zmax=6,
                ticklabel style={font=\tiny},
                legend pos=outer north east,
                legend style={cells={align=left}},
                legend cell align={left},
                view={135}{25}
            ]
%             \addplot3[surf,domain=-5:10,domain y=-3:5,samples=21,samples y=21,z buffer=sort] 
%           {x*x+x*y+2};
            %\addplot3[red,thick,variable=\t,domain=-1:0,samples y=0] ({1+4*t},{2+t},{5-t});
            \addplot3[surf,domain=-5:5,domain y=-5:5,samples=61,samples y=61,z
            buffer=sort,point meta=z] 
            ({cos(22.5)*x-sin(22.5)*y},{cos(22.5)*y+sin(22.5)*x},{(4 + (1 + sqrt(2))*x*x - (-1 + sqrt(2))*y*y)/2});         

            \addlegendentry{\(z=x^2+xy+2\)}
            \addplot3[red,thick,variable=\t,domain=0:3,samples y=0] ({1+4*t},{2+t},{5-t});
            \addlegendentry{\(r\)}
            \addplot3[green,thick,variable=\t,domain=-1:2,samples y=0] ({4+5*t},{-2+6*t},{3});
            \addlegendentry{\(\vec X\)}
            \addplot3[soldot] coordinates {(1,2,5)} node[above right] {$A$};
            \addplot3[soldot] coordinates {(9,4,3)} node[left] {$r\cap\vec X$};
        \end{axis}
    \end{tikzpicture}
\end{center}

\end{document}

введите описание изображения здесь

Вот как можно ограничить график. Вычислите функцию xcrit(y), которая определяет, что xдолжно быть для заданного y, чтобы функция имела определенное постоянное значение. Используйте это, чтобы обрезать график.

\documentclass{article}
\usepackage[a4paper,margin=1in,footskip=0.25in]{geometry}

\usepackage{pgfplots}
\pgfplotsset{compat=1.16,width=15cm}
\pgfplotsset{soldot/.style={color=black,only marks,mark=*}}
\begin{document}

\begin{center}
    \begin{tikzpicture}[declare function={f(\x,\y)=\x*\x+\x*\y+2;
        ftransformed(\x,\y)=(4 + (1 + sqrt(2))*\x*\x - (-1 + sqrt(2))*\y*\y)/2;
    xcrit(\y,\c)=sqrt(-1 + sqrt(2))*sqrt(-4 + 2*\c + 
     (-1 + sqrt(2))*\y*\y);}]
        \begin{axis} [
                axis on top,
                axis lines=center,
                xlabel=$x$,
                ylabel=$y$,
                zlabel=$z$,
                zmax=6,
                ticklabel style={font=\tiny},
                legend pos=outer north east,
                legend style={cells={align=left}},
                legend cell align={left},
                view={135}{25}
            ]
%             \addplot3[surf,domain=-5:10,domain y=-3:5,samples=21,samples y=21,z buffer=sort] 
%           {x*x+x*y+2};
            %\addplot3[red,thick,variable=\t,domain=-1:0,samples y=0] ({1+4*t},{2+t},{5-t});
            \begin{scope}
             \clip plot[variable=\y,domain=-6:6]
              ({-cos(22.5)*xcrit(\y,6)-sin(22.5)*\y},{cos(22.5)*\y-sin(22.5)*xcrit(\y,6)},{6})
              -- ({-cos(22.5)*xcrit(6,6)-sin(22.5)*6},{cos(22.5)*6-sin(22.5)*xcrit(6,6)},{-10})
              --({-cos(22.5)*xcrit(-6,6)+sin(22.5)*6},{-cos(22.5)*6-sin(22.5)*xcrit(-6,6)},{-10})
              ;         
             \addplot3[surf,domain=-5:0,domain y=-5:5,samples=31,samples y=61,z
              buffer=sort,point meta=z,forget plot]            
             ({cos(22.5)*x-sin(22.5)*y},{cos(22.5)*y+sin(22.5)*x},{ftransformed(x,y)});         
            \end{scope}
            \begin{scope}
            \clip plot[variable=\y,domain=-7:7]
             ({cos(22.5)*xcrit(\y,6)-sin(22.5)*\y},{cos(22.5)*\y+sin(22.5)*xcrit(\y,6)},{6})
             -- ({cos(22.5)*xcrit(7,6)-sin(22.5)*6},{cos(22.5)*6+sin(22.5)*xcrit(7,6)},{-10})
             --({cos(22.5)*xcrit(-7,6)+sin(22.5)*6},{-cos(22.5)*6+sin(22.5)*xcrit(-7,6)},{-10})
             ;          
             \addplot3[surf,domain=0:5,domain y=-5:5,samples=31,samples y=61,z
             buffer=sort,point meta=z]            
            ({cos(22.5)*x-sin(22.5)*y},{cos(22.5)*y+sin(22.5)*x},{ftransformed(x,y)});         
            \end{scope}
%           \draw[thick,red] plot[variable=\y,domain=-5:5]
%            ({cos(22.5)*xcrit(\y,6)-sin(22.5)*\y},{cos(22.5)*\y+sin(22.5)*xcrit(\y,6)},{6});
            \addlegendentry{\(z=x^2+xy+2\)}
            \addplot3[red,thick,variable=\t,domain=0:3,samples y=0] ({1+4*t},{2+t},{5-t});
            \addlegendentry{\(r\)}
            \addplot3[green,thick,variable=\t,domain=-1:2,samples y=0] ({4+5*t},{-2+6*t},{3});
            \addlegendentry{\(\vec X\)}
            \addplot3[soldot] coordinates {(1,2,5)} node[above right] {$A$};
            \addplot3[soldot] coordinates {(9,4,3)} node[left] {$r\cap\vec X$};
        \end{axis}
    \end{tikzpicture}
\end{center}
\end{document}

введите описание изображения здесь

Связанный контент