一、求解非線性方程
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/zh-tw/n/286895.html
微信掃一掃
支付寶掃一掃