强基初中数学&学Python——第五十八课 函数与方程之二:科学家是如何发现函数解析式的——函数三法

  上一节课说到,万事万物都在变化,其中某些变化的量之间具有函数关系。那科学家是如何发现这些函数关系的呢?

  第一步、把事物分为对象。一个对象与该对象之外有可辨分界。例如,在一个鱼缸中装有水,在水中有五条鱼游动,支架是个对象,鱼缸是一个对象,水也是一个对象,水上面的空气也是个对象,五条鱼是五个对象

  第二步、划分系统。系统内的对象紧密联系在一起,互相影响。上例中的支架、鱼缸、水、空气和五条鱼就构成了一个系统。

  第三步、提出问题。有了系统之后,就可以针对这个系统提出要解决的问题。例如针对这个鱼缸系统,提出:如何使这五条鱼更加活跃?

  第四步、提取因子。所谓提取因子就是找出系统中的对象与问题有关联的属性。鱼缸系统中除了水,其它对象的影响可以忽略。那么水的什么属性(因子)能影响鱼的活跃程度呢?这是一个科学问题了,科学家们懂的。这里只是为了说明数学问题,假设其他情况不变,与水的温度和溶氧浓度(溶解在水中氧气的浓度)这两个属性(因子)有关。

  第五步、建立和简化模型。模型与系统不同,模型中会忽略系统中对象的其他属性,认为对象是被研究的属性(因子)的化身,这样就可以用数学方法去解决实际的问题。所以,鱼的活跃度、水温和溶氧就构成了我们要研究的模型。从数学角度来说,就要找出鱼的活跃度与水温及溶解氧的函数关系。

  第六步、实验设计。首先,量化指标。水温和溶解氧都有实际的量化指标,但活跃程度没有,这样就要为活跃程度指定一个量化指标(我不懂,科学家们懂。)。然后,做出实验方案。由于本例因子超过1个,一般采用正交实验方案。本文为了说明数学问题,采用一般实验方案,就是保持其他因子不变,改变一个因子,看结果如何。这个例子就是保持溶解氧浓度不变,测定水温对鱼活跃程度的影响;保持水温不变,测定溶解氧浓度对鱼活跃程度的影响。最后,组装实验系统。这个例子需要溶解氧调节装备、水温控制装备等一些装备。

  第七步、进行实验,收集数据。如何进行实验是一个科学问题,那是科学家们的拿手好戏。从数学的角度来说,这是函数的初级阶段——表格,就是用表格的形式表达量的函数关系。假设得到下面的数据(非真实数据):

1 溶解氧(7mg/L)水温对鱼活跃度的影响

序号

水温(°C)

活跃度(假设单位是A)

1

10

3.47

2

11

5.01

3

12

6.33

4

13

7.44

5

14

8.37

6

15

9.09

7

16

9.59

8

17

9.89

9

18

10.00

10

19

9.91

11

20

9.59

12

21

9.07

13

22

8.37

14

23

7.44

15

24

6.33

16

25

5.01

2 水温(18°C)溶解氧对鱼活跃度的影响

序号

溶解氧(mg/L)

活跃度(假设单位是A)

1

4.5

6.43

2

4.8

6.87

3

5.1

7.28

4

5.4

7.70

5

5.7

8.14

6

6.0

8.58

7

6.3

9.00

8

6.6

9.42

9

6.9

9.86

10

7.2

10.29

11

7.5

10.71

12

7.8

11.13

13

8.1

11.57

14

8.4

12.00

15

8.7

12.43

16

9.0

12.86

  第八步、图示实验数据。通过看数据表,很难发现什么规律,画成图表更能体现数据中隐藏的规律。从数学的角度来说,这是函数的中级阶段——函数的图象。一般地,对于一个函数(一元),如果把自变量与函数的每对对应值分别作为点的横、纵坐标,那么坐标平面内由这些点组成的图形,就是这个函数的图象。上两表打点图如下(作图代码附录1):

 

  第九步、拟合函数图。所谓拟合函数图,就是用已知的函数图与实验得到的函数图进行对比,找出吻合已知的函数图,从而得到函数解析式——函数的高级阶段。下图把上面的打点图拟合成函数图(增加的代码附录2)。

 

由程序计算结果得到:

水温-活跃度函数解析式:y=10-0.102(x-18)²

溶解氧-活跃度函数解析式:y=1.43x

  科学家们做的事并不神秘,一个初中生也可以进行科学研究。他们通过实验得到函数的初级阶段——表格,然后通过数据处理得到函数的中级阶段——图象,和高级阶段——解析式。表格、图象和解析式都可以表示具体的函数,这三种表示函数的方法,分别称为解析式法、列表法和图象法。具体采用什么方法,按要求或具体问题具体分析。是不是所有的具体函数都可以用三种不同的方法表示呢?

  具体的函数,因为每个对应都是一组具体的数,原则上都可以用表格法表示。至于图象法和解析法情况就不一样。

  下图是体检时的心电图,其中图上点的横坐标x表示时间,纵坐标y表示心脏部位的生物电流,它们是两个变量,在心电图中,对于x的每一个确定的值,y都有唯一确定的值与其对应。

 

但要拟合出解析式几乎不可能,也没有必要。

  现有一个函数解析式p=x+2y+3z,能否用图象法表示呢?由于每个对应都是4个数的元组,我们的视觉最多能辨别3维空间,那第四个数就无法在图中了。所以只有不超过2个自变量的函数才能使用图象法。

  表示函数的三个方法,只是函数的外在表现,函数内在的意义是刻画变量之间对应关系的数学模型。我们要掌握函数外在的方法,也要认识函数内在的意义,更要具有函数的思想,象科学家那样用函数的思想解决问题。

 

附录1

import sys
sys.path.append("/5xstar/pyfiles")
from mymath.rcs import *
import turtle as t
t.setup(500,800)
t.screensize(350,650)
t.up()
build(t,wc=(-20,-20,330,630))
'''
1 溶解氧(7mg/L)水温对鱼活跃度的影响
序号    水温(°C    活跃度(假设单位是A)
'''
da=[]
da.append((1,10,3.47))
da.append((2,11,5.01))
da.append((3,12,6.33))
da.append((4,13,7.44))
da.append((5,14,8.37))
da.append((6,15,9.09))
da.append((7,16,9.59))
da.append((8,17,9.89))
da.append((9,18,10.00))
da.append((10,19,9.91))
da.append((11,20,9.59))
da.append((12,21,9.07))
da.append((13,22,8.37))
da.append((14,23,7.44))
da.append((15,24,6.33))
da.append((16,25,5.01))
t.pencolor("red")
for d in da:
    t.setpos(d[0]*20,(d[2]-3)*50)
    t.dot("red")
    t.write("(%s, %s)" % (str(d[1]), str(d[2])),move=False)
t.seth(-90)
t.fd(30)
t.write("水温--活跃度");
    
'''
2 水温(18°C)溶解氧对鱼活跃度的影响
序号,溶解氧(mg/L,活跃度(假设单位是A)
'''
db=[]
db.append((1,4.5,6.43))
db.append((2,4.8,6.87))
db.append((3,5.1,7.28))
db.append((4,5.4,7.70))
db.append((5,5.7,8.14))
db.append((6,6.0,8.58))
db.append((7,6.3,9.00))
db.append((8,6.6,9.42))
db.append((9,6.9,9.86))
db.append((10,7.2,10.29))
db.append((11,7.5,10.71))
db.append((12,7.8,11.13))
db.append((13,8.1,11.57))
db.append((14,8.4,12.00))
db.append((15,8.7,12.43))
db.append((16,9.0,12.86))
t.pencolor("blue")
for d in db:
    t.setpos(d[0]*20,(d[2]-1)*50)
    t.dot("blue")
    t.write("(%s, %s)" % (str(d[1]), str(d[2])),move=False)
t.fd(30)
t.write("溶解氧--活跃度");    
t.ht()

 

附录2


'''
拟合函数图
温度-活跃度图
18°C时最大10,抛物线可知函数是y=10-a(x-18)²
通过其它点算出a=(10-y)/(x-18)²的平均值即可。
溶解氧--活跃度
直线,一次函数图,函数是y=bx+c
算出平均点,然后用平均点与不相邻点算出b,c平均值即可。
'''
from fractions import Fraction
a=Fraction(0)
for i in range(16):
    if i!=8:
        a+=(10-Fraction(str(da[i][2])))/(da[i][1]-18)**2
a/=15
print("y=10-%f(x-18)²" % float(a))
def fa(x):
    return (10-a*(x+9-18)**2-3)*100/2/20
t.pencolor("black")
trace(t,1,16,fa)

b, c = Fraction(0), Fraction(0)
sx, sy  = Fraction(0), Fraction(0)
for i in range(16):
    sx+=db[i][1]
    sy+=db[i][2]
sx/=16
sy/=16
num=0
for i in range(16):
    if abs(sx-db[i][1])>=0.3:
        num+=1
        tb=(sy-Fraction(str(db[i][2])))/(sx-Fraction(str(db[i][1])))
        b+=tb
        c+=sy-tb*sx
b/=num
c/=num
print("y=%sx+%s" % (str(b),str(c)))
def fb(x):
    return (b*(4.5+0.3*(x-1)) +c-1)*100/2/20
t.pencolor("green")
trace(t,1,16,fb)