一、求解非线性方程
1、二分法
二分法又称为折半法,是最简单、最易于理解的一种迭代方法。它的基本思路就是根据函数值定位目标区间,然后缩小区间范围,直到满足精度要求或者次数达到了迭代次数上限。下面是二分法求解非线性方程的Python代码示例:
def f(x): return x ** 2 - 2 def bisection(a, b, eps, N): i = 0 while i < N: c = (a + b) / 2 if abs(f(c)) < eps: return c if f(a) * f(c) < 0: b = c else: a = c i += 1 return None print(bisection(1, 2, 1e-6, 100))
2、牛顿法
牛顿法是求解非线性方程最常用的方法之一,优点是收敛速度快,但是它的缺点是需要计算函数的导数,在一些情况下可能比较麻烦。下面是牛顿法求解非线性方程的Python代码示例:
def f(x): return x ** 2 - 2 def df(x): return 2 * x def newton(a, eps, N): i = 0 x = a while i < N: x = x - f(x) / df(x) if abs(f(x)) < eps: return x i += 1 return None print(newton(1.5, 1e-6, 100))
二、插值与拟合
1、拉格朗日插值
拉格朗日插值是一种常用的插值方法,它的基本思路是通过已知点的函数值来构造一个多项式函数,从而求解未知点的函数值。下面是使用拉格朗日插值求解函数在给定点的函数值的Python代码示例:
import numpy as np def lagrange(x, y, xx): n = len(x) yy = 0 for i in range(n): l = 1 for j in range(n): if i != j: l *= (xx - x[j]) / (x[i] - x[j]) yy += l * y[i] return yy x = np.array([0, 1, 2]) y = np.array([1, 2, 1]) print(lagrange(x, y, 0.5))
2、最小二乘拟合
最小二乘拟合是通过最小化误差平方和来寻找最佳的拟合曲线,它可以用于线性拟合和非线性拟合。下面是使用最小二乘拟合方法对一组数据进行线性拟合的Python代码示例:
import numpy as np import matplotlib.pyplot as plt x = np.array([1, 2, 3, 4]) y = np.array([1.2, 1.9, 3.2, 4.1]) A = np.vstack([x, np.ones(len(x))]).T a, b = np.linalg.lstsq(A, y, rcond=None)[0] plt.plot(x, y, 'o', label='Original data', markersize=10) plt.plot(x, a * x + b, 'r', label='Fitted line') plt.legend() plt.show()
三、数值微分与数值积分
1、三点公式
三点公式是一种常用的数值微分方法,它的基本思路是利用已知点周围的函数值,通过求导公式计算出目标点的导数值。下面是使用三点公式对给定函数在给定点计算导数值的Python代码示例:
import numpy as np def f(x): return np.exp(x) def df(x, h): return (f(x+h)-f(x-h)) / (2*h) print(df(0, 1e-6))
2、梯形法
梯形法是一种常用的数值积分方法,它的基本思路是将函数图像下面的区域拆分成多个梯形形状,然后通过计算每个梯形的面积来估计积分值。下面是使用梯形法计算给定函数在给定区间内的定积分值的Python代码示例:
import numpy as np def f(x): return np.exp(-x ** 2) def trapezoidal(a, b, n): h = (b - a) / n x = np.linspace(a, b, n+1) y = f(x) I = h * (np.sum(y) - 0.5 * (y[0] + y[-1])) return I print(trapezoidal(0, 1, 10000))
四、常微分方程数值解
1、龙格-库塔法
龙格-库塔法是一种常用的数值解常微分方程方法,它的基本思路是通过多次迭代,逐步逼近每一个离散时间点上的解。下面是使用龙格-库塔法求解一阶常微分方程的Python代码示例:
import numpy as np def f(t, y): return -y def RK11(f, t0, y0, h, N): t = np.zeros(N+1) y = np.zeros(N+1) t[0], y[0] = t0, y0 for i in range(N): k1 = f(t[i], y[i]) k2 = f(t[i] + h, y[i] + h*k1) y[i+1] = y[i] + h * (k1 + k2) / 2 t[i+1] = t0 + (i+1) * h return t, y t, y = RK11(f, 0, 1, 0.1, 10) print(y)
2、欧拉法
欧拉法是一种简单的数值解常微分方程方法,它的基本思路是通过泰勒级数展开对微分方程进行逼近,从而求解未来的函数值。下面是使用欧拉法求解一阶常微分方程的Python代码示例:
import numpy as np def f(t, y): return -y def euler(f, t0, y0, h, N): t = np.zeros(N+1) y = np.zeros(N+1) t[0], y[0] = t0, y0 for i in range(N): y[i+1] = y[i] + h * f(t[i], y[i]) t[i+1] = t0 + (i+1) * h return t, y t, y = euler(f, 0, 1, 0.1, 10) print(y)
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/286895.html