自留-Python:线性拟合(直线+曲线)

使用最小二乘法的线性拟合,自留代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import rcParams
import math
import matplotlib

读取数据

#(1)读取excel数据
df = pd.read_excel(r'C:\Users\Administrator\Desktop\worklist.xlsx')
data = np.array(df)

#(2)自己设定组数
X=np.array([0,1.34,2.25,4.67,7.2,9.6,12.79,15.61]) 
Y=np.array([0,12.5,25,50,100,200,400,800])

直线拟合

#定义直线拟合函数
def linear_regression(x, y): 
    N = len(x)
    sumx = sum(x)
    sumy = sum(y)
    sumx2 = sum(x**2)
    sumxy = sum(x*y)
 
    A = np.mat([[N, sumx], [sumx, sumx2]])
    b = np.array([sumy, sumxy])
 
    return np.linalg.solve(A, b)
 
a10, a11 = linear_regression(X, Y)


# 生成拟合直线的绘制点
_X1 = np.arange (0,20,0.01)
_Y1 = np.array([a10 + a11 * x for x in _X1])

#画图
plt.figure(figsize=(6,6))
plt.plot(_X1, _Y1, 'b', linewidth=2) 
plt.legend(bbox_to_anchor=(1,0),loc="lower left")
plt.title("y = {} + {}x".format(a10, a11)) #标题
plt.show()

 曲线拟合

# 生成系数矩阵A
def gen_coefficient_matrix(X, Y): 
    N = len(X)
    m = 3
    A = []
    # 计算每一个方程的系数
    for i in range(m):
        a = []
        # 计算当前方程中的每一个系数
        for j in range(m):
            a.append(sum(X ** (i+j)))
    A.append(a)
    return A
 
# 计算方程组的右端向量b
def gen_right_vector(X, Y): 
    N = len(X)
    m = 3
    b = []
    for i in range(m):
        b.append(sum(X**i * Y))
    return b
 
A = gen_coefficient_matrix(X, Y) 
b = gen_right_vector(X, Y)
 
a0, a1, a2 = np.linalg.solve(A, b)
print(a0,a1,a2)

#绘制拟合曲线
_X = np.arange(0, 20, 0.01) 
_Y = np.array([a0 + a1*x + a2*x**2 for x in _X])


#画图
plt.figure(figsize=(10,6))
plt.plot(X,Y,'o',markersize=10,label='Hou等(2017)')

#plt.plot(_X, _Y, 'b', linewidth=2,label="$I$ = {:.2f} + {:.2e}$n$ +{:.2e}$n^2$ ".format(a0, a1, a2))    #{:.2f}等用于保留小数

plt.plot(_X, _Y, 'b', linewidth=2,label="式(1) ") 
#plt.gca().invert_yaxis()
plt.legend(fontsize=16,frameon=False)
#plt.legend(bbox_to_anchor=(0.5,-0.35),loc=10,ncol=2,frameon=False) #图框
#plt.title("AI = {} + {}n + {}$n^2$ ".format(a0, a1, a2))   #标题
plt.show()

 

  • 2
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用 SQL 的 CASE-WHEN 语句来替换地块类别。下面是一个例子: ``` UPDATE table_name SET dklb = CASE WHEN dklb = 10 THEN '承包地块' WHEN dklb = 21 THEN '自地' WHEN dklb = 22 THEN '机动地' WHEN dklb = 23 THEN '开荒地' WHEN dklb = 99 THEN '其他集体土地' ELSE dklb END ``` 这句话就是说更新表中所有dklb字段中等于10 的为承包地块,等于21的为自地,等于22的为机动地,等于23的为开荒地,等于99的为其他集体土地,其他的保持不变。 当然,还可以在查询中使用CASE-WHEN,来达到替换字段值相同的目的,如下 ``` SELECT dklb, CASE WHEN dklb = 10 THEN '承包地块' WHEN dklb = 21 THEN '自地' WHEN dklb = 22 THEN '机动地' WHEN dklb = 23 THEN '开荒地' WHEN dklb = 99 THEN '其他集体土地' ELSE '其他' END AS dklb_name FROM table_name; ``` 如上,就是选取表中的dklb字段和替换后的dklb_name,其中dklb_name是用原来的dklb字段来替换达到相同的目的,在这里是只是展示目的,并没有对原始数据进行修改 ### 回答2: 可以使用SQL的CASE WHEN语句来替换地块类别字段dklb的值。根据题目描述,我们需要将字段dklb的值替换为相应的地块类别。 假设表名为land,可以使用以下SQL语句来实现替换操作: ``` UPDATE land SET dklb = CASE WHEN dklb = 10 THEN '承包地块' WHEN dklb = 21 THEN '自地' WHEN dklb = 22 THEN '机动地' WHEN dklb = 23 THEN '开荒地' WHEN dklb = 99 THEN '其他集体土地' ELSE '未知类别' END; ``` 上述语句中,CASE WHEN语句会根据字段dklb的值进行判断,当满足条件时,将对应的地块类别字符串赋值给dklb字段。如果字段值不在给定的条件范围内,则会被替换为'未知类别'。 执行以上SQL语句后,字段dklb的值将被替换成相应的地块类别,实现了对地块类别的替换操作。 ### 回答3: 可以使用SQL的CASE WHEN语句来替换地块类别字段。 CASE WHEN语句的语法如下: CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ELSE result END 根据题目要求,我们可以使用如下的CASE WHEN语句来替换地块类别字段‘dklb’: SELECT CASE WHEN dklb = 10 THEN '承包地块' WHEN dklb = 21 THEN '自地' WHEN dklb = 22 THEN '机动地' WHEN dklb = 23 THEN '开荒地' WHEN dklb = 99 THEN '其他集体土地' ELSE '未知' END AS 地块类别 FROM my_table; 以上语句将根据‘dklb’字段的值,返回对应的地块类别。如果‘dklb’的值为10,则返回‘承包地块’,如果‘dklb’的值为21,则返回‘自地’,以此类推。如果‘dklb’的值不在这些条件中,则返回‘未知’。 注意:将my_table替换为实际的表名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值