<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Julia Community 🟣: Yuto Horikawa</title>
    <description>The latest articles on Julia Community 🟣 by Yuto Horikawa (@hyrodium).</description>
    <link>https://forem.julialang.org/hyrodium</link>
    <image>
      <url>https://forem.julialang.org/images/RPFj7Vf_ayPwi1M2Hr3KqoMbTUnnj9vreOrh5GNnCGA/rs:fill:90:90/g:sm/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L3VzZXIvcHJvZmls/ZV9pbWFnZS8zMzYv/Mzc3MGNhZjUtNmFm/Ni00YWVjLTk2OTMt/NjQyZmMxZjBkNGNm/LnBuZw</url>
      <title>Julia Community 🟣: Yuto Horikawa</title>
      <link>https://forem.julialang.org/hyrodium</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.julialang.org/feed/hyrodium"/>
    <language>en</language>
    <item>
      <title>Plotting smooth graphs with Julia</title>
      <dc:creator>Yuto Horikawa</dc:creator>
      <pubDate>Fri, 22 Jul 2022 14:38:00 +0000</pubDate>
      <link>https://forem.julialang.org/hyrodium/plotting-smooth-graphs-with-julia-6mj</link>
      <guid>https://forem.julialang.org/hyrodium/plotting-smooth-graphs-with-julia-6mj</guid>
      <description>&lt;h1&gt;
  
  
  Abstract
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;The graphs (curves) output by Plots.jl are polygonal lines, so they look a bit like sharp edges.&lt;/li&gt;
&lt;li&gt;If we use the &lt;a href="https://github.com/hyrodium/BasicBSpline.jl"&gt;BasicBSpline.jl package&lt;/a&gt; to plot the curve, they will be approximated by Bézier curves, and we'll be happy!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The package used in this article can be installed from Julia's REPL with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="x"&gt;]&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;Plots&lt;/span&gt;
&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;StaticArrays&lt;/span&gt;
&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;BasicBSpline&lt;/span&gt;
&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="o"&gt;://&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;hyrodium&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;BasicBSplineExporter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jl&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Smooth case
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Plotting with &lt;code&gt;Plots.jl&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Let's begin by plotting with &lt;a href="https://docs.juliaplots.org/stable/"&gt;the Plots.jl package&lt;/a&gt;!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;Plots&lt;/span&gt;

&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;# plot sin curve from -8 to 8&lt;/span&gt;
&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"sin_Plots.svg"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;# save with SVG format&lt;/span&gt;
&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"sin_Plots.png"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;# save with PNG format&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://forem.julialang.org/images/eTYjAaiW_BJo3VflXwGu9VD7zeq28lupAZrDmofQHZQ/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzL3ph/ZjExbmhrYmEyMzdo/YWQycWZuLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/eTYjAaiW_BJo3VflXwGu9VD7zeq28lupAZrDmofQHZQ/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzL3ph/ZjExbmhrYmEyMzdo/YWQycWZuLnBuZw" alt="sin plot" width="600" height="400"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Zoom in on the SVG image near the maxima.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forem.julialang.org/images/7-oMXnnz0fS9Oe5uNYZ8NuoBHagM1QN4X7b_vMfqqEw/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzL2Ix/ZDRzd3VkeG9kazls/a3N6eDgyLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/7-oMXnnz0fS9Oe5uNYZ8NuoBHagM1QN4X7b_vMfqqEw/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzL2Ix/ZDRzd3VkeG9kazls/a3N6eDgyLnBuZw" alt="sin plot zoom 1" width="880" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forem.julialang.org/images/i85pUhGcSap-w4Au_dgmbHuCBt6yYdw7zDiZtv-PbV8/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzLzZ6/a3FydWoxZDZ1Y2Vo/bG04eTl6LnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/i85pUhGcSap-w4Au_dgmbHuCBt6yYdw7zDiZtv-PbV8/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzLzZ6/a3FydWoxZDZ1Y2Vo/bG04eTl6LnBuZw" alt="sin plot zoom 2" width="880" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It seems non-smooth curve with sharp edges.&lt;/p&gt;

&lt;p&gt;This is because the curve is approximated by a polyline. The following image shows an SVG image opened in Inkscape.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forem.julialang.org/images/Nx7xO0JGpVJ-62I9LYSY53hteU8LYWqwm-pYZEQnC8s/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzLzhx/aXRuZXV4ZW1wN2hn/ajVndmFrLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/Nx7xO0JGpVJ-62I9LYSY53hteU8LYWqwm-pYZEQnC8s/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzLzhx/aXRuZXV4ZW1wN2hn/ajVndmFrLnBuZw" alt="sin plot in inkscape" width="880" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How can we get a smooth graph?&lt;br&gt;
SVG supports Bézier curves, so it should be possible as the file format...&lt;br&gt;
→ Use the &lt;a href="https://hyrodium.github.io/BasicBSpline.jl/stable/"&gt;BasicBSpline.jl package&lt;/a&gt;!&lt;/p&gt;
&lt;h2&gt;
  
  
  Plotting with &lt;code&gt;BasicBSplineExporter.jl&lt;/code&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;BasicBSpline&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;BasicBSplineExporter&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;StaticArrays&lt;/span&gt;

&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SVector&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt; &lt;span class="c"&gt;# pamametrized sine curve&lt;/span&gt;
&lt;span class="n"&gt;t0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;t1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;             &lt;span class="c"&gt;# endpoints&lt;/span&gt;

&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;                                     &lt;span class="c"&gt;# Polynomial degree; SVG allows Bézier curves up to 3rd degree.&lt;/span&gt;
&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;KnotVector&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;KnotVector&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="c"&gt;# Knot vector&lt;/span&gt;
&lt;span class="n"&gt;P&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BSplineSpace&lt;/span&gt;&lt;span class="x"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="x"&gt;}(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;                    &lt;span class="c"&gt;# B-spline space (piecewise polynomial space)&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fittingcontrolpoints&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="x"&gt;,(&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="x"&gt;,))&lt;/span&gt;  &lt;span class="c"&gt;# Calculate control points of B-spline curve&lt;/span&gt;
&lt;span class="n"&gt;M&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BSplineManifold&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="x"&gt;,(&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="x"&gt;,))&lt;/span&gt; &lt;span class="c"&gt;# Define B-spline curve&lt;/span&gt;
&lt;span class="n"&gt;save_svg&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"sin_BasicBSpline.svg"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xlims&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="x"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ylims&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt; &lt;span class="c"&gt;# Save in SVG format&lt;/span&gt;
&lt;span class="n"&gt;save_png&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"sin_BasicBSpline.png"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xlims&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="x"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ylims&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt; &lt;span class="c"&gt;# Save in PNG format&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://forem.julialang.org/images/Rfkb2GRFMQaNvjHOCX_zKacxA8HZtdUu-6B4BRKyc5s/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzLzhh/dmtleDN3bWppcHdx/eHZnamI3LnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/Rfkb2GRFMQaNvjHOCX_zKacxA8HZtdUu-6B4BRKyc5s/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzLzhh/dmtleDN3bWppcHdx/eHZnamI3LnBuZw" alt="sin plot with BasicBSpline.jl" width="880" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Checking with Inkscape, you can see that the curve is smoothly represented by the Bézier curve as shown below. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://forem.julialang.org/images/F7LHs9DGj1Zl8qZuBtfyOn4QlFBsGP5ujXpr5LOnecQ/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzLzBp/b296Y21teHJoMDh3/NHRyZmo3LnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/F7LHs9DGj1Zl8qZuBtfyOn4QlFBsGP5ujXpr5LOnecQ/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzLzBp/b296Y21teHJoMDh3/NHRyZmo3LnBuZw" alt="sin plot with BasicBSpline.jl inkscape" width="880" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forem.julialang.org/images/iAaw_3OEULT_IUeOxBDUq768Yh4kenIMol9uoNKH-f8/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzLzBp/ZmJxZzhydjdudDNq/OHkxOGtkLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/iAaw_3OEULT_IUeOxBDUq768Yh4kenIMol9uoNKH-f8/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzLzBp/ZmJxZzhydjdudDNq/OHkxOGtkLnBuZw" alt="sin plot with BasicBSpline.jl inkscape zoom" width="748" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The B-spline curve defined above is connected at the knots so that the entire curve is 

&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;C2C^2&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;C&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 class smooth. Since the curve is polynomial in each section, the curve is represented as a piecewise polynomial.&lt;/p&gt;
&lt;h1&gt;
  
  
  Non-smooth case
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Plotting with &lt;code&gt;Plots.jl&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Let's plot a graph of 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;f(x)=∣sin⁡(x)∣f(x) = |\sin(x)|&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mop"&gt;sin&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 with Plots.jl&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;abs∘sin&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"abssin_Plots.svg"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"abssin_Plots.png"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://forem.julialang.org/images/3WqfM-1qvOBlsMQmtrS8VGojbI-klJKmEbMjn26rF9o/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzL2lq/cnUyZm83bzRhOHM5/cmRpbGpiLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/3WqfM-1qvOBlsMQmtrS8VGojbI-klJKmEbMjn26rF9o/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzL2lq/cnUyZm83bzRhOHM5/cmRpbGpiLnBuZw" alt="abssin plot" width="600" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since this is a polyline approximation, the graph appears to capture the characteristics even at discontinuities in the derivatives. &lt;/p&gt;

&lt;h2&gt;
  
  
  Plotting with &lt;code&gt;BasicBSplineExporter.jl&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;As before, graphs can be output by doing the following.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;f(t) = SVector(t,abs(sin(t)))
t0,t1 = -8,8
p = 3
k = KnotVector(range(t0,t1,length=50))+p*KnotVector(t0,t1)
P = BSplineSpace{p}(k)

a = fittingcontrolpoints(f,(P,))
M = BSplineManifold(a,(P,))
save_svg("abssin_BasicBSpline![](https://storage.googleapis.com/zenn-user-upload/555b66bd3bac-20211229.png).svg", M, xlims=(-10,10), ylims=(-2,2))
save_png("abssin_BasicBSpline.png", M, xlims=(-10,10), ylims=(-2,2))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exported graph↓&lt;br&gt;
&lt;a href="https://forem.julialang.org/images/PtFh5ROAs-d2pdSkZG8xsaR4PW-qAEPESLbxy3D2M40/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzL29m/em1rejJhaHVoa3pv/Z2Q2NTNoLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/PtFh5ROAs-d2pdSkZG8xsaR4PW-qAEPESLbxy3D2M40/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzL29m/em1rejJhaHVoa3pv/Z2Q2NTNoLnBuZw" alt="abs sin with BasicBSpline" width="880" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Zoom in on the singularity↓&lt;br&gt;
&lt;a href="https://forem.julialang.org/images/BxghyJffsDKA9hNjNTlkXU2hza4m2UnKoczVMRfMOnI/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzLzd2/bzA4NWh4ZnhydnV5/aWRqZjl1LnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/BxghyJffsDKA9hNjNTlkXU2hza4m2UnKoczVMRfMOnI/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzLzd2/bzA4NWh4ZnhydnV5/aWRqZjl1LnBuZw" alt="singularity point zoom" width="880" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even if the number of knots (the number of segmented polynomial divisions) is increased, the approximation accuracy will not improve much because of the "smoothly connected" constraint.&lt;/p&gt;

&lt;p&gt;In B-spline theory, it is necessary to place more than one knot at the root of sin because the smoothness of the curve decreases as the knots overlap.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt;&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;KnotVector&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;KnotVector&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t0&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;KnotVector&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nb"&gt;π&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;π&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nb"&gt;π&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;# Duplicate knots at points where we want to reduce smoothness&lt;/span&gt;
&lt;span class="n"&gt;P&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BSplineSpace&lt;/span&gt;&lt;span class="x"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="x"&gt;}(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fittingcontrolpoints&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="x"&gt;,(&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="x"&gt;,))&lt;/span&gt;
&lt;span class="n"&gt;M&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BSplineManifold&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="x"&gt;,(&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="x"&gt;,))&lt;/span&gt;
&lt;span class="n"&gt;save_svg&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"abssin_BasicBSpline_modified.svg"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xlims&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="x"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ylims&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;save_png&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"abssin_BasicBSpline_modified.png"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xlims&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="x"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ylims&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="x"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exported graph↓&lt;br&gt;
&lt;a href="https://forem.julialang.org/images/NXfhhGNC3O5SpoIFFbFdkTlEa8lP6zV05U6FHThiMMs/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzL2Fo/cTNueXF2bXdqNm9r/a3NyeDl5LnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/NXfhhGNC3O5SpoIFFbFdkTlEa8lP6zV05U6FHThiMMs/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzL2Fo/cTNueXF2bXdqNm9r/a3NyeDl5LnBuZw" alt="abssin with BasicBSpline" width="880" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Beautiful even when zoomed in!&lt;br&gt;
&lt;a href="https://forem.julialang.org/images/UXYaB6GmzIt8yhowT7AsIh6n3GaPrtzGHh6WaPKOfv4/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzL3Y0/MmFxOGM1N3JsbjNu/dWRpMzhwLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/UXYaB6GmzIt8yhowT7AsIh6n3GaPrtzGHh6WaPKOfv4/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzL3Y0/MmFxOGM1N3JsbjNu/dWRpMzhwLnBuZw" alt="abssin with BasicBSpline zoom" width="880" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;With &lt;a href="https://github.com/hyrodium/BasicBSpline.jl"&gt;BasicBSpline.jl package&lt;/a&gt;, it's convenient to output smooth graphs!&lt;/li&gt;
&lt;li&gt;B-spline allows you to change the smoothness depending on the overlap of knot vector!&lt;/li&gt;
&lt;li&gt;Plots.jl is a really great package for plotting!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: this post is a English translation of &lt;a href="https://zenn.dev/hyrodium/articles/9e7ce1b67afc57"&gt;this article&lt;/a&gt; in zenn.dev.&lt;/p&gt;

</description>
      <category>plotting</category>
      <category>bspline</category>
    </item>
  </channel>
</rss>
