Python已知坐标点数值拟合出n次多项式

问题描述

已知坐标点的数值,如(x_1,y_1), (x_2,y_2)...,通过程序拟合出他们之间的函数曲线。

(这里我的需求是拟合出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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值