当前位置:   article > 正文

Python求解数值分析问题(线性方程组、非线性方程、函数插值、最小二乘法、数值积分)_python scipy 非线性方程组

python scipy 非线性方程组

目录

 前言

一、线性方程组      

二、非线性方程

1、二分法

2、牛顿法 

三、函数插值

四、最小二乘法

五、数值积分


 前言

NumPy 和 SciPy 是 Python 进行科学计算和数据分析非常重要的两个基础包,它们各有侧重。

NumPy: 提供高性能的多维数组对象 ndarray 和丰富的数组操作方法;包含基础数学、统计、线性代数、随机数生成等功能;数组广播、向量化操作,提高计算效率;与其他Python科学计算包集成良好。

SciPy: 在NumPy基础上提供更多数学算法和高级数据处理工具;包含优化、积分、插值、拟合、特殊函数等模块;提供信号处理、图像处理、常微分方程求解等功能;统计分析模块,如分布拟合、假设检验等;提供有效的数值计算算法,可解决多种数学问题

总结:NumPy提供数组和基础运算,侧重数学计算;SciPy在NumPy基础上提供更高级的科学与工程计算算法,侧重数据处理与分析;两者DAILY配合使用,构成 Python强大的科学计算生态系统。


 

一、线性方程组      

 例1

 

 代码如下:

  1. import numpy as np
  2. # a=np.mat('1,2,3;2,4,8;9,6,3')
  3. a=np.mat('-11,2,4,3,1;1,18,6,-3,5;3,-1,9,1,-2;3,-2,4,13,2;4,-2,3,-8,18')
  4. b=np.mat('-9;4;-12;6;-15')
  5. # b=np.mat('1;1;3')
  6. c=np.linalg.solve(a,b)
  7. print(c)

结果截图:

二、非线性方程

例2

 

 

1、二分法

代码如下:

  1. def f(x):
  2. return x**5-3*x**4+6*x**3-x**2+7*x-2
  3. # 确定区间并设置精度
  4. left = 0
  5. right = 1
  6. epsilon = 0.0001
  7. # 二分法求解
  8. while right - left > epsilon:
  9. middle = (left + right) / 2 # 计算中间点
  10. if f(middle) == 0:
  11. break # 中间点是根,结束循环
  12. if f(left) * f(middle) < 0: # 根处于(left, middle)区间
  13. right = middle
  14. else: # 根处于(middle, right)区间
  15. left = middle
  16. # 输出结果
  17. print((left + right) / 2)

结果截图: 

2、牛顿法 

代码如下:

  1. def f(x):
  2. return x**5-3*x**4+6*x**3-x**2+7*x-2
  3. # 定义函数的导数
  4. def f_prime(x):
  5. return 5*x**4-12*x**3+18*x**2+7
  6. # 设置初始值和精度
  7. x0 = 0
  8. epsilon = 0.0001
  9. # 牛顿法迭代
  10. x1 = x0 - f(x0)/f_prime(x0)
  11. while abs(x1 - x0) > epsilon:
  12. x0 = x1
  13. x1 = x0 - f(x0)/f_prime(x0)
  14. # 输出结果
  15. print(x1)

结果截图: 

三、函数插值

例3

x

9

11

13

15

17

lnx

2.197225

2.397895

2.564949

2.708050

2.833213

求出ln11.63 ,   ln14.13.           (2.4536)    (2.6483)

代码如下:

  1. def f(x):
  2. return np.log(x)
  3. # 构建差商表
  4. def generate_diff_table(x_data, y_data):
  5. n = len(x_data)
  6. diff_table = [y_data]
  7. for r in range(1, n):
  8. diff_row = [0] * (n - r)
  9. for j in range(n - r):
  10. diff_row[j] = (diff_table[r-1][j+1] - diff_table[r-1][j]) / (x_data[j+r] - x_data[j])
  11. diff_table.append(diff_row)
  12. return diff_table
  13. # 插值求解
  14. def interpolation(x_data, x):
  15. n = len(x_data)
  16. y = 0
  17. diff_table = generate_diff_table(x_data, [f(x_i) for x_i in x_data])
  18. for i in range(n):
  19. p = 1
  20. for j in range(i):
  21. p = p * (x - x_data[j])
  22. y += diff_table[i][0] * p
  23. return y
  24. x_data = [9, 11, 13, 15, 17]
  25. x = 11.63
  26. result = interpolation(x_data, x)
  27. print(result)
  28. y_data = [9, 11, 13, 15, 17]
  29. y = 14.13
  30. result = interpolation(y_data, y)
  31. print(result)

结果截图: 

四、最小二乘法

例4

x

26.8

25.4

28.9

27.7

23.9

24.7

28.1

26.9

27.4

22.6

25.6

y

26.5

27.3

24.2

23.6

25.9

26.3

22.5

21.7

21.4

25.8

24.9

代码如下:

  1. # 拟合曲线
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. import scipy as sp
  5. from scipy.optimize import leastsq
  6. # 样本数据
  7. Xi = np.array([26.8, 25.4, 28.9, 27.7, 23.9, 24.7, 28.1, 26.9, 27.4, 22.6,25.6])
  8. Yi = np.array([26.5, 27.3, 24.2, 23.6, 25.9, 26.3, 22.5, 21.7, 21.4, 25.8, 24.9])
  9. # 需要拟合的函数func()指定函数的形状
  10. def func(p, x):
  11. k, b = p
  12. return k*x + b
  13. # 定义偏差函数,x,y为数组中对应Xi,Yi的值
  14. def error(p, x, y):
  15. return func(p, x) - y
  16. # 设置k,b的初始值,可以任意设定,经过实验,发现p0的值会影响cost的值:Para[1]
  17. p0 = [1, 20]
  18. # 把error函数中除了p0以外的参数打包到args中,leastsq()为最小二乘法函数
  19. Para = leastsq(error, p0, args=(Xi, Yi))
  20. # 读取结果
  21. k, b = Para[0]
  22. print('k=', k, 'b=', b)
  23. # 画样本点
  24. plt.figure(figsize=(8, 6))
  25. plt.scatter(Xi, Yi, color='red', label='Sample data', linewidth=2)
  26. # 画拟合直线
  27. x = np.linspace(30, 20, 10)
  28. y = k * x + b
  29. # 绘制拟合曲线
  30. plt.plot(x, y, color='blue', label='Fitting Curve', linewidth=2)
  31. plt.legend() # 绘制图例
  32. plt.xlabel('X-value', fontproperties='simHei', fontsize=12)
  33. plt.ylabel('Y-value', fontproperties='simHei', fontsize=12)
  34. plt.show()

结果截图:

五、数值积分

例5

代码如下: 

  1. import numpy as np
  2. x = np.linspace(0, 3, 1001)
  3. # f = lambda x: x**3 - 4*x**2 + 4*x + 2
  4. f = lambda x: 1/(1+x)
  5. a = 0
  6. b = 2
  7. Ax = np.linspace(a, b, 101)
  8. Ay = f(Ax)
  9. def defInt_middle(f, a, b, N):
  10. # middle point
  11. result = 0; FX = []; Xn = []
  12. dx = abs(b - a)/N
  13. while a < b:
  14. result += f(a + dx/2)*dx
  15. FX += [f(a + dx/2)]
  16. Xn += [a]
  17. a += dx
  18. return result, FX, Xn, dx
  19. N = 4
  20. I_mid, FX, Xn, dx = defInt_middle(f, a, b, N)
  21. print(I_mid)

结果截图: 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/995537
推荐阅读
相关标签
  

闽ICP备14008679号