【Python】利用Python拟合函数曲线
<svg xmlns="http://www.w3.org/2000/svg" style="display: none"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)"></path>
</svg>
<blockquote>
<p>使用Python拟合函数曲线需要用到一些第三方库:</p>
<ul><li> <p>numpy:科学计算的基础库(例如:矩阵)</p> </li><li> <p>matplotlib:绘图库</p> </li><li> <p>scipy:科学计算库</p> </li></ul>
<p>如果没有安装过这些库,需要在命令行中输入下列代码进行安装:</p>
<pre><code class="prism language-bash">pip <span class="token function">install</span> numpy matplotlib scipy
</code></pre>
</blockquote>
<h2>拟合多项式</h2>
<pre><code class="prism language-python"><span class="token triple-quoted-string string">'''
Author: CloudSir
Date: 2021-08-01 13:40:50
LastEditTime: 2021-08-02 09:41:54
LastEditors: CloudSir
Description: Python拟合多项式
https://github.com/cloudsir
'''</span>
<span class="token keyword">import</span> matplotlib<span class="token punctuation">.</span>pyplot <span class="token keyword">as</span> plt
<span class="token keyword">import</span> numpy <span class="token keyword">as</span> np
x <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">]</span>
y <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">2.83</span><span class="token punctuation">,</span> <span class="token number">9.53</span><span class="token punctuation">,</span> <span class="token number">14.52</span><span class="token punctuation">,</span> <span class="token number">21.57</span><span class="token punctuation">,</span> <span class="token number">38.26</span><span class="token punctuation">,</span> <span class="token number">53.92</span><span class="token punctuation">,</span> <span class="token number">73.15</span><span class="token punctuation">,</span> <span class="token number">101.56</span><span class="token punctuation">,</span> <span class="token number">129.54</span><span class="token punctuation">,</span> <span class="token number">169.75</span><span class="token punctuation">,</span> <span class="token number">207.59</span><span class="token punctuation">]</span>
z1 <span class="token operator">=</span> np<span class="token punctuation">.</span>polyfit<span class="token punctuation">(</span>x<span class="token punctuation">,</span> y<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span> <span class="token comment">#用3次多项式拟合,输出系数从高到0</span>
p1 <span class="token operator">=</span> np<span class="token punctuation">.</span>poly1d<span class="token punctuation">(</span>z1<span class="token punctuation">)</span> <span class="token comment">#使用次数合成多项式</span>
y_pre <span class="token operator">=</span> p1<span class="token punctuation">(</span>x<span class="token punctuation">)</span>
plt<span class="token punctuation">.</span>plot<span class="token punctuation">(</span>x<span class="token punctuation">,</span>y<span class="token punctuation">,</span><span class="token string">'.'</span><span class="token punctuation">)</span>
plt<span class="token punctuation">.</span>plot<span class="token punctuation">(</span>x<span class="token punctuation">,</span>y_pre<span class="token punctuation">)</span>
plt<span class="token punctuation">.</span>show<span class="token punctuation">(</span><span class="token punctuation">)</span>
</code></pre>
<p><img src="https://img-blog.csdnimg.cn/384ab2a4f747433882ea66357a03fa7b.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0ODAyMDI4,size_16,color_FFFFFF,t_70"></p>
<h3>函数说明</h3>
<h4><code>np.polyfit(x, y, n)</code></h4>
<p>功能:拟合曲线</p>
<p>参数:</p>
<ul><li>x,y:x和y的原始数据</li><li>n:要拟合的次数</li></ul>
<p>返回值:</p>
<ul><li> <p>一个列表,拟合出的系数,顺序为从高到底</p>
<blockquote>
<p>例: n=3时,会利用 <span class="katex--display"><span class="katex-display"><span class="katex"><span class="katex-mathml">
a
x
3
+
b
x
2
+
c
ax^3+bx^2+c
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.947438em; vertical-align: -0.08333em"></span><span class="mord mathdefault">a</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.864108em"><span class="" style="top: -3.113em; margin-right: 0.05em"><span class="pstrut" style="height: 2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em"></span></span><span class="base"><span class="strut" style="height: 0.947438em; vertical-align: -0.08333em"></span><span class="mord mathdefault">b</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.864108em"><span class="" style="top: -3.113em; margin-right: 0.05em"><span class="pstrut" style="height: 2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em"></span></span><span class="base"><span class="strut" style="height: 0.43056em; vertical-align: 0"></span><span class="mord mathdefault">c</span></span></span></span></span></span> 拟合函数,并返回拟合出的系数 </p>
</blockquote> </li></ul>
<h4><code>np.poly1d(li, r=False)</code></h4>
<p>功能:生成多项式函数</p>
<p>参数:</p>
<ul><li> <p>li:</p>
<ul><li> <p>当没有r参数或 r=False 时,传入一个系数列表(次数从高到低),利用该列表生成多项式函数并返回</p>
<blockquote>
<p>import numpy as np</p>
<p>f = np.poly1d()</p>
<p>“”"<span class="katex--display"><span class="katex-display"><span class="katex"><span class="katex-mathml">
f
(
x
)
=
2
x
2
+
3
x
+
4
f(x) = 2x^2+3x+4
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em"></span><span class="mord mathdefault" style="margin-right: 0.10764em">f</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em"></span></span><span class="base"><span class="strut" style="height: 0.947438em; vertical-align: -0.08333em"></span><span class="mord">2</span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.864108em"><span class="" style="top: -3.113em; margin-right: 0.05em"><span class="pstrut" style="height: 2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em"></span></span><span class="base"><span class="strut" style="height: 0.72777em; vertical-align: -0.08333em"></span><span class="mord">3</span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right: 0.222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0"></span><span class="mord">4</span></span></span></span></span></span>"""</p>
<p>print(f(2)) # 18</p>
</blockquote> </li><li> <p>当参数 r=True 时,传入一个根列表,利用该列表生成多项式函数并返回</p>
<blockquote>
<p>import numpy as np</p>
<p>f = np.poly1d(, True)</p>
<p>“”“<span class="katex--display"><span class="katex-display"><span class="katex"><span class="katex-mathml">
f
(
x
)
=
(
x
−
2
)
∗
(
x
−
3
)
∗
(
x
−
4
)
f(x) = (x-2)*(x-3)*(x-4)
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em"></span><span class="mord mathdefault" style="margin-right: 0.10764em">f</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em"></span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right: 0.222222em"></span><span class="mbin">−</span><span class="mspace" style="margin-right: 0.222222em"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em"></span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.222222em"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em"></span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right: 0.222222em"></span><span class="mbin">−</span><span class="mspace" style="margin-right: 0.222222em"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em"></span><span class="mord">3</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.222222em"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em"></span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right: 0.222222em"></span><span class="mbin">−</span><span class="mspace" style="margin-right: 0.222222em"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em"></span><span class="mord">4</span><span class="mclose">)</span></span></span></span></span></span>”""</p>
<p>print(f(0)) # -24</p>
</blockquote> </li></ul> </li></ul>
<p>返回值:</p>
<ul><li>见上</li></ul>
<h2>拟合任意函数</h2>
<pre><code class="prism language-python"><span class="token triple-quoted-string string">'''
Author: CloudSir
Date: 2021-08-03 15:01:17
LastEditTime: 2021-08-03 15:26:05
LastEditors: CloudSir
Description: Python拟合任意函数
https://github.com/cloudsir
'''</span>
<span class="token comment"># 引用库函数</span>
<span class="token keyword">import</span> numpy <span class="token keyword">as</span> np
<span class="token keyword">import</span> matplotlib<span class="token punctuation">.</span>pyplot <span class="token keyword">as</span> plt
<span class="token keyword">from</span> scipy <span class="token keyword">import</span> optimize <span class="token keyword">as</span> op
plt<span class="token punctuation">.</span>rcParams<span class="token punctuation">[</span><span class="token string">'font.sans-serif'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">'SimHei'</span><span class="token punctuation">]</span><span class="token comment"># 用来正常显示中文</span>
plt<span class="token punctuation">.</span>rcParams<span class="token punctuation">[</span><span class="token string">'axes.unicode_minus'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">False</span> <span class="token comment"># 用来正常显示负号</span>
<span class="token comment"># 需要拟合的函数</span>
<span class="token keyword">def</span> <span class="token function">f_1</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> A<span class="token punctuation">,</span> B<span class="token punctuation">,</span> C<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> A <span class="token operator">*</span> x<span class="token operator">**</span><span class="token number">2</span> <span class="token operator">+</span> B <span class="token operator">*</span> x <span class="token operator">+</span> C
<span class="token comment"># 需要拟合的数据组</span>
x_group <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">]</span>
y_group <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">2.83</span><span class="token punctuation">,</span> <span class="token number">9.53</span><span class="token punctuation">,</span> <span class="token number">14.52</span><span class="token punctuation">,</span> <span class="token number">21.57</span><span class="token punctuation">,</span> <span class="token number">38.26</span><span class="token punctuation">,</span> <span class="token number">53.92</span><span class="token punctuation">,</span> <span class="token number">73.15</span><span class="token punctuation">,</span> <span class="token number">101.56</span><span class="token punctuation">,</span> <span class="token number">129.54</span><span class="token punctuation">,</span> <span class="token number">169.75</span><span class="token punctuation">,</span> <span class="token number">207.59</span><span class="token punctuation">]</span>
<span class="token comment"># 得到返回的A,B值</span>
A<span class="token punctuation">,</span> B<span class="token punctuation">,</span> C <span class="token operator">=</span> op<span class="token punctuation">.</span>curve_fit<span class="token punctuation">(</span>f_1<span class="token punctuation">,</span> x_group<span class="token punctuation">,</span> y_group<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span>
<span class="token comment"># 数据点与原先的进行画图比较</span>
plt<span class="token punctuation">.</span>scatter<span class="token punctuation">(</span>x_group<span class="token punctuation">,</span> y_group<span class="token punctuation">,</span> marker<span class="token operator">=</span><span class="token string">'o'</span><span class="token punctuation">,</span>label<span class="token operator">=</span><span class="token string">'真实值'</span><span class="token punctuation">)</span>
x <span class="token operator">=</span> np<span class="token punctuation">.</span>arange<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">,</span> <span class="token number">0.01</span><span class="token punctuation">)</span>
y <span class="token operator">=</span> A <span class="token operator">*</span> x<span class="token operator">**</span><span class="token number">2</span> <span class="token operator">+</span> B <span class="token operator">*</span>x <span class="token operator">+</span> C
plt<span class="token punctuation">.</span>plot<span class="token punctuation">(</span>x<span class="token punctuation">,</span> y<span class="token punctuation">,</span>color<span class="token operator">=</span><span class="token string">'red'</span><span class="token punctuation">,</span>label<span class="token operator">=</span><span class="token string">'拟合曲线'</span><span class="token punctuation">)</span>
plt<span class="token punctuation">.</span>legend<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># 显示label</span>
plt<span class="token punctuation">.</span>show<span class="token punctuation">(</span><span class="token punctuation">)</span>
</code></pre>
<p><img src="https://img-blog.csdnimg.cn/7ff878686c5f48bdaae0adbbebc8c168.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0ODAyMDI4,size_16,color_FFFFFF,t_70"></p>
<h3>函数说明</h3>
<h4><code>op.curve_fit(f, x, y)</code></h4>
<p>功能:拟合任意函数</p>
<p>参数:</p>
<ul><li> <p>f:要拟合的函数类型</p> <pre><code class="prism language-python"><span class="token comment"># 构建一个二次函数</span>
<span class="token keyword">def</span> <span class="token function">f</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> A<span class="token punctuation">,</span> B<span class="token punctuation">,</span> C<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> A <span class="token operator">*</span> x<span class="token operator">**</span><span class="token number">2</span> <span class="token operator">+</span> B <span class="token operator">*</span> x <span class="token operator">+</span> C
op<span class="token punctuation">.</span>curve_fit<span class="token punctuation">(</span>f<span class="token punctuation">,</span> x<span class="token punctuation">,</span> y<span class="token punctuation">)</span> <span class="token comment"># 进行拟合</span>
</code></pre> </li><li> <p>x, y:x和y的原始数据</p> </li></ul>
<p>返回值:一个元组 (popt,pcov)</p>
<ul><li> <p>popt是一个一维数组,表示得到的拟合方程的参数。</p> </li><li> <p>pcov是一个二维数组,是在popt参数下得到的协方差。</p> </li></ul><br><br>
来源:https://www.cnblogs.com/cloudsir/p/15317479.html
頁:
[1]