2 python任意函式擬合

2021-10-08 08:47:59 字數 2974 閱讀 1120

功能:最小二乘法擬合一元線性多項式 p(1)*x**n+p(2)*x**(n-1)*...*p(n-1)*x+p(n),指數不能是小數

模組:numpy

**如下:

import matplotlib.pyplot as plt

import numpy as np

x = np.arange(1, 17, 1)

y = np.array([4.00, 6.40, 8.00, 8.80, 9.22, 9.50, 9.70, 9.86, 10.00, 10.20, 10.32, 10.42, 10.50, 10.55, 10.58, 10.60])

z1 = np.polyfit(x, y, 3)#用3次多項式擬合,輸出係數從高到0

p1 = np.poly1d(z1)#使用次數合成多項式

yvals=p1(x)

plt.plot(x,y,'*')

plt.plot(x,yvals)

plt.show()

計算結果:

#np.poly1d函式解釋

1)p1 = np.poly1d([1,2,3])使用係數合成多項式 1*x**2+2*x**1+3*x**0

2)p1 = np.poly1d([1,2,3],true)使用根合成多項式(x-1)*(x-2)*(x-3)

3)p1(0.5)表示當x = 0.5時,多項式的值為多少

4)p1.r表示當多項式為 0 時,此等式的根

5)p1.c表示生成多項式的係數陣列

6)p1.order表示返回最高項的次方數

7)p1[1]表示返回第一項的係數

8)多項式支援實數的四則運算

功能:最小二乘法擬合一元任意函式 y=f(x)

模組:from scipy import optimize

**如下: 

import numpy as np

import matplotlib.pyplot as plt

from scipy import optimize

def func(x,a,b):#需要擬合的函式

return a*np.exp(b/x)

# 擬合點

x0 = [1, 2, 3, 4, 5]

y0 = [1, 3, 8, 18, 36]

a4, b4= optimize.curve_fit(func, x0, y0)[0]

x4 = np.arange(1, 6, 0.01)

y4 = a4*np.exp(b4/x4)

plt.figure()

plt.scatter(x0[:], y0[:], 25, "red")

plt.plot(x4, y4, "purple")

plt.show()

計算結果:

存在問題:bounds=[,],指定引數範圍,長度是1或者和引數一樣多,為1時表示所有引數都是這個數,[0,[20,30]]即0功能:最小二乘法任意函式

模組:from scipy import optimize

**如下: 

import numpy as np

from scipy import optimize # 最小二乘法擬合

import matplotlib.pyplot as plt # python matplotlib 繪圖

from mpl_toolkits.mplot3d import axes3d # 3d 繪圖

def func(x, y, p):

""" 資料擬合所用的函式:z=ax+by

:param x: 自變數 x

:param y: 自變數 y

:param p: 擬合引數 a, b

"""a, b, c = p

return a * x**2 + b * y +c*x

def residuals(p, z, x, y):

""" 得到資料 z 和擬合函式之間的差

"""print(p)

return z - func(x, y, p)

def main():

x = np.arange(5)

y = np.arange(5)

z = np.array([2, 4, 7, 7, 10]) # 資料隨便取的

plsq = optimize.leastsq(residuals, np.array([0, 0, 0]), args=(z, x, y)) # 最小二乘法擬合

# [0, 0] 為引數 a, b 初始值

a, b, c= plsq[0] # 獲得擬合結果

print("擬合結果:\na = {}".format(a))

print("b = {}".format(b))

print("c = {}".format(c))

# 繪圖

xp = np.linspace(-1, 6, 100)

yp = np.linspace(-1, 6, 100)

x, y = np.meshgrid(xp, yp)

z = func(x, y, [a, b, c]) # 帶入擬合得到的 a, b, c

fig = plt.figure(figsize=(8, 6))

ax = axes3d(fig) # 3d 繪圖

ax.plot_su***ce(x, y, z, alpha=0.5)

ax.scatter(x, y, z, color="r")

ax.set_xlabel("x")

ax.set_ylabel("y")

ax.set_zlabel("z")

plt.show()

main()

2 Python內建函式

位元組陣列和位元組,3個引數 source,encoding,errors 當source引數為字串時,encoding引數也必須提供,函式將字串使用str.encode方法轉換成位元組陣列 當3個引數都不傳的時候,返回長度為0的位元組陣列 當source引數為整數時,返回這個整數所指定長度的空位元...

python入門2 Python入門2

1列表和元組 列表 當索引超出了範圍時,python會報乙個indexerror錯誤 usr bin env python3 coding utf 8 列印s的1,v,9.注意 索引計數從 0 開始 s 1,2,3 a v b 7,8,9 列印1 print s 0 0 列印v print s 1 ...

2 Python 函式作為返回值

函式作為返回值 高階函式除了可以接收函式作為引數外,還可以把函式作為結果值返回。我們來實現乙個可變引數的求和。通常情況下,求和的函式是這樣定義的 def lazy sum args def sum ax 0 for n in args ax ax n return ax return sum f l...