From b1880774bc9ba4225d563e8a153de82f10b8b1eb Mon Sep 17 00:00:00 2001 From: zhengp Date: Fri, 4 Aug 2023 10:56:31 +0800 Subject: [PATCH] add final example --- README.rst | 34 +++++++++++++++++++++++++++++++++- images/readme_usage_3.png | Bin 0 -> 24279 bytes 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 images/readme_usage_3.png diff --git a/README.rst b/README.rst index aa146f1..5de5335 100644 --- a/README.rst +++ b/README.rst @@ -78,4 +78,36 @@ XSpline can be used to obtain definite integrals. ax[0].plot(x, iy) ax[1].plot(x, idesign_mat) -.. image:: images/readme_usage_2.png \ No newline at end of file +.. image:: images/readme_usage_2.png + +XSpline can extrapolate with different polynomial options + +.. code-block:: python + + np.random.seed(123) + # constant extrapolation one the left and linear extrapolation on the right + spline = XSpline( + knots=[0, 0.25, 0.5, 0.75, 1], + degree=3, + ldegree=0, + rdegree=1, + coef=np.random.randn(len(spline)), + ) + x = np.arange(-0.5, 1.51, 0.01) + y, design_mat = spline(x), spline.get_design_mat(x) + + fig, ax = plt.subplots(1, 2, figsize=(10, 3)) + ax[0].plot(x, y) + ax[1].plot(x, design_mat) + for i in range(len(ax)): + ax[i].vlines( + [0, 1], + ymin=0, + ymax=1, + transform=ax[i].get_xaxis_transform(), + linestyle="--", + linewidth=1, + color="grey", + ) + +.. image:: images/readme_usage_3.png diff --git a/images/readme_usage_3.png b/images/readme_usage_3.png new file mode 100644 index 0000000000000000000000000000000000000000..6809ce0fc78829a00f790da767d4c23eb8ba2e84 GIT binary patch literal 24279 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