python函数拟合编程_Python函数拟合,python

博主通过直播过程中的数学问题,探讨了如何通过数列关系推导y值。首先尝试用线性、二次及高次函数逼近,最终确定y与x、z的关系为六次多项式。通过实例求解,得出y的值为-351.60606060605966,揭示了数列的循环特征。
摘要由CSDN通过智能技术生成

背景

bdc625ed1361c73287dc99565396015d.png

最近在抖音直播数学答疑的时候,恰好有一位朋友问到了这个问题,已知x,z,y三列数据如上图所示,请问y的最后一位数是多少?

乍一看,还以为很简单,拎(抡)起粉笔就一顿操作(猛如虎)

(1)分别将x,z,y三列数据记作3个数列

{

x

n

}

,

{

z

n

}

\{x_n\}, \{z_n\}

{

x

n

}

,

{

z

n

}

{

y

n

}

\{y_n\}

{

y

n

}

, 其中n表示其所在数列的序号或位置。

(2)很容易发现如下规律

z

n

x

n

=

6

(1)

z_n-x_n=6 \tag{1}

z

n

x

n

=

6

(

1

)

x

n

+

y

n

=

x

n

+

1

(2)

x_n+y_n=x_{n+1} \tag{2}

x

n

+

y

n

=

x

n

+

1

(

2

)

以及

z

n

+

y

n

=

z

n

+

1

(3)

z_n+y_n=z_{n+1} \tag{3}

z

n

+

y

n

=

z

n

+

1

(

3

)

将(2)和(3)组合一下便得到(1),即

z

n

x

n

=

z

n

+

1

x

n

+

1

=

6

(4)

z_n-x_n=z_{n+1}-x_{n+1} =6 \tag{4}

z

n

x

n

=

z

n

+

1

x

n

+

1

=

6

(

4

)

而问题相当于是要求

{

y

n

}

\{y_n\}

{

y

n

}

的下一个

y

n

+

1

y_{n+1}

y

n

+

1

,上面3个关系式中却没有任何项涉及到,故这些关系不能解决根本问题,现在摆在我们面前的有两条路

找出数列

{

x

n

}

\{x_n\}

{

x

n

}

,

{

z

n

}

\{z_n\}

{

z

n

}

的下一项 m 和 m+6,然后利用(1)-(4)的关系进行求解

y

n

y_{n}

y

n

下一项

λ

\lambda

λ

序号

1

2

3

4

5

6

7

8

9

x

-5

5

0

2

9

6

4

10

m

z

1

11

6

8

15

12

10

16

m+6

y

10

-5

2

7

-3

-2

6

λ

\lambda

λ

直接找出

{

y

n

}

{

x

n

}

,

{

z

n

}

\{y_n\} 和\{x_n\}, \{z_n\}

{

y

n

}

{

x

n

}

,

{

z

n

}

之间的关系表达式, 即

y

n

=

f

(

x

n

,

z

n

)

(5)

y_n = f(x_n, z_n) \tag{5}

y

n

=

f

(

x

n

,

z

n

)

(

5

)

{

x

n

}

\{x_n\}

{

x

n

}

{

z

n

}

\{z_n\}

{

z

n

}

的关系,(5)又可以改写成

y

n

=

f

(

x

n

)

(6)

y_n = f(x_n) \tag{6}

y

n

=

f

(

x

n

)

(

6

)

第一条道路相当于绕了一圈,简称间接法,第二条道路更直接,简称直接法,我们先采用直接法来进行解答

先画出

{

y

n

}

{

x

n

}

\{y_n\} 和\{x_n\}

{

y

n

}

{

x

n

}

散点图

ab103353f5f638b3b216393230ec7e9a.png

为了找出

{

y

n

}

{

x

n

}

\{y_n\} 和\{x_n\}

{

y

n

}

{

x

n

}

之间的函数关系,我们可以先建立一个最简单最纯粹的假设

y

=

a

x

+

b

(7)

y =ax+b \tag{7}

y

=

a

x

+

b

(

7

)

没错,就是最简单的线性关系,然后拟合出来系数 a 和 b分别是 -0.97580645和5.0702765 (保留8位小数),这样

{

y

n

}

{

x

n

}

\{y_n\} 和\{x_n\}

{

y

n

}

{

x

n

}

之间的函数关系便是

y

=

0.9758

x

+

5.07

(8)

y = -0.9758 x + 5.07\tag{8}

y

=

0

.

9

7

5

8

x

+

5

.

0

7

(

8

)

然后画出来拟合函数,观察其与原数列之间的差距

b4aedaa970d0fc103dc1faa9dbed2978.png

我们看到除了第1个点和第5个点靠得近,其余的点差距还是挺大的,既然一次拟合性能太差,那么我来个2次函数呗,即假设

y

=

a

x

2

+

b

x

+

c

(9)

y =ax^2+bx+c \tag{9}

y

=

a

x

2

+

b

x

+

c

(

9

)

29f3a6059f7bb9707191245dc58c0fda.png

观察发现2次函数拟合和1次函数拟合没啥大的区别,再继续提高拟合函数次数

4次时候

421db6f30540b9fdeb960554c65ba783.png

观察发现第1,3,4,5四个点都靠的比较近,差距在缩小,继续提高次数

5次的时候

4b58eb26520ee900488f5fc8f5c0bba2.png

观察发现第2,6,7三个点拟合的还不够完美,继续提高次数

6次的时候

7a491a7525128011ed93d81cfcecce68.png

此时,拟合曲线恰好经过数列

{

y

n

}

\{y_n\}

{

y

n

}

的7点,可以认为拟合效果比较完美,此时的拟合函数为

y

=

0.01265

x

6

+

0.2035

x

5

0.591

x

4

4.176

x

3

+

22.7

x

2

24.32

x

+

2

(10)

y = -0.01265 x^6 + 0.2035 x^5 - 0.591 x^4 - 4.176 x^3 + 22.7 x^2 - 24.32 x + 2 \tag{10}

y

=

0

.

0

1

2

6

5

x

6

+

0

.

2

0

3

5

x

5

0

.

5

9

1

x

4

4

.

1

7

6

x

3

+

2

2

.

7

x

2

2

4

.

3

2

x

+

2

(

1

0

)

将x = 10代入上(10)式,求得 y = -351.60606060605966

从y值可以猜出这是一个无限循环小数,循环节为6060,故最后所求的y值为

351.

6060

˙

-351.\dot{6060}

3

5

1

.

6

0

6

0

˙

完整代码

# -*- coding: utf-8 -*-

"""

Project name: 找规律

Description:

Created on Sun Sep 20 17:27:34 2020

@author: 帅帅de三叔

"""

import numpy as np #导入数值分析模块

import matplotlib.pyplot as plt #导入绘图模块

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

x = [-5, 5, 0, 2, 9, 6, 4]

z = [1, 11, 6, 8, 15, 12, 10]

y = [10, -5, 2, 7, -3, -2, 6]

plt.figure(figsize = (6,4))

plt.scatter(x0, x, color = 'r', label = "x")

plt.scatter(x0, z, color = 'g', label = "z")

plt.scatter(x0, y, color ="brown", label = "y")

coef = np.polyfit(x, y, 6) #求出系数

print('拟合函数的系数 :\n', coef ) #打印出系数

funExpression = np.poly1d(coef) #求出表达式

print('拟合表达式 :\n',funExpression) #打印出表达式

yFit =np.polyval(funExpression, x) #求出拟合函数的y值

print("拟合出来的y值:\n", yFit)

plt.plot(x0, yFit, color = 'blue', label ="fitting line")

nextY = np.polyval(funExpression, 10) #求出拟合函数的y值

print("所求的y的值为:", nextY )

plt.legend(loc = "upper left")

plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值