看案例
我们知道金属电阻率是温度的函数,设金属的电阻温度系数为,金属样品在时的电阻为,则其电阻随温度变化的关系可为
根据实验所测的的物理量,采用拟合的方法求解出和。
0 | 4.38 | 70 | 5.58 | 140 | 6.74 |
10 | 4.56 | 80 | 5.74 | 150 | 6.94 |
20 | 4.70 | 90 | 5.96 | 160 | 7.12 |
30 | 4.86 | 100 | 6.06 | 170 | 7.28 |
40 | 5.08 | 110 | 6.26 | 180 | 7.42 |
50 | 5.24 | 120 | 6.44 | 190 | 7.60 |
60 | 5.40 | 130 | 6.58 | 200 | 7.78 |
from sympy import *
import sympy as sp
import matplotlib.pyplot as plt
import numpy as np
#法一,利用python库求解偏导数和求解方程组
def f(x,y,n):
global a1,a2
a1=symbols('a1');a2=symbols('a2');po=0
for i in range(n):
po+=(y[i]-a1-a2*x[i])**2
zli=diff(po,a1,1)
zlo=diff(po,a2,1)
return zli,zlo
#法二,利用线性方程推导的公式直接求解a0,a1
def g(x,y,n):
xtot=0;ytot=0;xytot=0;x2=0
for i in range(n):
xtot+=x[i];ytot+=y[i];xytot+=x[i]*y[i];x2+=x[i]**2
xp=xtot/n;yp=ytot/n;xyp=xytot/n;x2p=x2/n
a11=(xyp-xp*yp)/(x2p-xp**2);a22=(yp-a11*xp)
return a22,a11
x=[n for n in range(0,201,10)]
y=[4.38,4.56,4.70,4.86,5.08,5.24,5.40,5.58,5.74,5.96,6.06,6.26,6.44,6.58,6.74,6.94,7.12,7.28,7.42,7.60,7.78]
n=20
print('代书上的公式计算出来的a0和a1值:{}'.format(g(x,y,n)))
print('利用python库求解方程组,计算出来的a0和a1值:{}'.format(sp.linsolve(f(x,y,n),[a1,a2])._args_set))
xpi=np.arange(0,215,0.1)
yti=float(g(x,y,n)[0])+float(g(x,y,n)[1])*xpi
plt.rcParams['font.family']='SimHei'#可以在图上显示中文
plt.xlabel('温度,单位℃')
plt.ylabel('阻值,单位Ω')
plt.scatter(x,y,color='k',label='实际值')
plt.plot(xpi,yti,'b',label='预测值')
plt.legend()
plt.show()
运行结果(只展示图)。