Python实战训练(方程与拟合曲线)

1.方程

求e^x-派(3.14)的解

用二分法来求解,先简单算出解所在的区间,然后用迭代法求逼近解,一般不能得到精准的解,所以设置一个能满足自己进度的标准来判断解是否满足

这里打印出解x0是因为在递归过程中没有变量去接收返回值,所以返回x0,再打印x0得到的是None,再用numpy自带的log(pi)就查看解的相似度

import numpy as np

def f(x):
    return np.e**x-np.pi

resolution=0.00000001
global x
x=0
def search_x(x1,x2):
    x0=(x1+x2)/2
    if np.abs(f(x0)-0)<=resolution:
        print(x0)
    elif f(x1)*f(x0)<0:
        search_x(x0,x1)
    elif f(x2)*f(x0)<0:
        search_x(x0,x2)


search_x(0,10)
print("方程的解",np.log(np.pi))

2.拟合曲线 

有俩组数据,通过这俩组数据可以得到一个图像

import matplotlib.pyplot as plt
import numpy as np
from numpy import polyfit
from matplotlib.pylab import mpl

mpl.rcParams['font.sans-serif']=['SimHei']#仅有这俩行 可以显示中文  但是减号为定义
mpl.rcParams['axes.unicode_minus']=False



time=[0.25, 0.5, 0.75, 1 ,1.5 , 2 ,2.5 ,3 ,3.5 ,4 ,4.5 ,5,6,7,8,9,10,11,12,13,14,15,16]
alcohol=[30,68,75,82,82,77,68,68,58,51,50,41,38,35,28,25,18,15,12,10,7,7,4]
# print(len(time),len(alcohol))
plt.scatter(time,alcohol)
plt.title("project")
plt.xlabel("x")
plt.ylabel("y")
plt.show()

 

接下来就是对数据进行操作,是线性关系明显

time=[0.25, 0.5, 0.75, 1 ,1.5 , 2 ,2.5 ,3 ,3.5 ,4 ,4.5 ,5,6,7,8,9,10,11,12,13,14,15,16]
alcohol=[30,68,75,82,82,77,68,68,58,51,50,41,38,35,28,25,18,15,12,10,7,7,4]
y=[np.log(a) for a in alcohol]#把alcohol里面的数据取对数  根据原数据对象做出操作
# print(len(time),len(alcohol))
plt.scatter(time,y)
plt.title("project")
plt.xlabel("x")
plt.ylabel("y")
plt.show()

这个代码执行的是把alcohol的每个数据取出来在取对数,最后赋给y 

 

y=[np.log(a) for a in alcohol]

图像可以知道存在峰值,而峰值后的数据关系联系强,而峰值前的数据也同样,所以可以分段函数的办法来表现图像关系

.index 可以得到里面数据的索引

.max 可以得到数据中最大值

[alcohol.index(max(alcohol)):] 表示从最大值开始到最后一个数据

alcohol_tup=alcohol[alcohol.index(max(alcohol)):]

 polyfit(x,y,z)  x与y是俩个数据集  z表示是几次的函数 这里是y=kx+b 为一次,所以z=1

这里会返回俩个值,一个是k,一个是b

from numpy import polyfit
k,b=polyfit(time_tup,y_tup,1)#1表示次数为1次  2为2次

 

把数据都进行分段 

time=[0.25, 0.5, 0.75, 1 ,1.5 , 2 ,2.5 ,3 ,3.5 ,4 ,4.5 ,5,6,7,8,9,10,11,12,13,14,15,16]
alcohol=[30,68,75,82,82,77,68,68,58,51,50,41,38,35,28,25,18,15,12,10,7,7,4]
y=[np.log(a) for a in alcohol]#把alcohol里面的数据取对数  根据原数据对象做出操作
alcohol_tup=alcohol[alcohol.index(max(alcohol)):]#找到alcohol的最大数并返回索引  把最大值以及从最大值后面的数据索引 重新改造数据
time_tup=time[alcohol.index(max(alcohol)):]
y_tup=y[alcohol.index(max(alcohol)):]
k,b=polyfit(time_tup,y_tup,1)#1表示次数为1次  2为2次
#1次  是y=kx+b
print(k,b)

建立一个model函数来进行拟合

predy是在拟合函数中得到的y值 

time=[0.25, 0.5, 0.75, 1 ,1.5 , 2 ,2.5 ,3 ,3.5 ,4 ,4.5 ,5,6,7,8,9,10,11,12,13,14,15,16]
alcohol=[30,68,75,82,82,77,68,68,58,51,50,41,38,35,28,25,18,15,12,10,7,7,4]
y=[np.log(a) for a in alcohol]#把alcohol里面的数据取对数  根据原数据对象做出操作
alcohol_tup=alcohol[alcohol.index(max(alcohol)):]#找到alcohol的最大数并返回索引  把最大值以及从最大值后面的数据索引 重新改造数据
time_tup=time[alcohol.index(max(alcohol)):]
y_tup=y[alcohol.index(max(alcohol)):]
k,b=polyfit(time_tup,y_tup,1)#1表示次数为1次  2为2次
#1次  是y=kx+b
print(k,b)

def model(t):
    a=np.e**(k*t+b)
    return a

time0=np.linspace(time_tup[0],16,1000)
predy=model(time0)
plt.scatter(time,alcohol,label="原曲线")
plt.plot(time0,predy,label="拟合曲线")
plt.title("result")
plt.xlabel("alcohol")
plt.ylabel("time[h]")
plt.legend()
plt.show()


 可以看到峰值后的拟合曲线基本贴合原数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值