问题描述
已知坐标点的数值,如,通过程序拟合出他们之间的函数曲线。
(这里我的需求是拟合出n次多项式,以后还可以扩展到指数函数、对数函数...)
1.引入库
代码如下:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sympy import *
2.读入数据
代码如下:
#数据表格
df = pd.read_csv(r'C:/Users/hanhan/PycharmProjects/pythonProject/data1.csv',encoding = 'gbk')
df1 = pd.read_csv(r'C:/Users/hanhan/PycharmProjects/pythonProject/data2.csv',encoding = 'gbk')
3.求解步骤
完整版代码如下:
①首先定义两个空列表,一个用来存x的值,一个用来存y的值。
②通过for循环计算得出x和y的值,如果是已知明确的数值,不需要计算的,可以直接调到for循环的下面代码部分。
③将x和y的值输入到np.polyfit(x,y,3)函数中,3的意思是指3次多项式,根据实际情况设定。
④因为是3次多项式,所以得到的结果有四个数,分别是三个多项式系数及一个常数项。按照对应系数画出拟合出来的函数线条(也可以加上坐标的散点图)
plt.plot(x,y,'bo',ms = 5)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sympy import *
#数据表格
df = pd.read_csv(r'C:/Users/hanhan/PycharmProjects/pythonProject/data1.csv',encoding = 'gbk')
df1 = pd.read_csv(r'C:/Users/hanhan/PycharmProjects/pythonProject/data2.csv',encoding = 'gbk')
#参数定义
a0 = []
a1 = []
q = 1
for i in range(len(df)):
M_sj = np.array(df['shijian1'].iloc[i:i + q])
N_sj = np.array(df['shijian2'].iloc[i:i + q])
L_sj = np.array(df1['shijian3'].iloc[i:i + q])
constant1 = 2 * (L_sj) / (M_sj + N_sj)
constant2 = -2 * (M_sj) / (N_sj + L_sj)
a0.append(constant1[0])
a1.append(constant2[0])
x = a0
x = np.array(x)
print('x is :\n',x)
print('x is :\n',x.shape)
y = a1
y = np.array(y)
print('y is :\n',y)
#用3次多项式拟合
f = np.polyfit(x, y, 3)
print('f is :\n',f)
df1.to_csv(r'C:\\Users\\hanhan\\PycharmProjects\\pythonProject\\alldata.csv', encoding='gbk')
# 设置x的坐标范围
x=np.arange(0,100,0.01)
# 转化为网格
# x,y=np.meshgrid(x,y)
y = f[0] * np.power(x,3) + f[1] * np.power(x,2) + f[2] * np.power(x,1) + f[3]
plt.scatter(x, y, c='r')
plt.show()