數值算法 (Numerical Algorithms) 是一種以數值計算為基礎的演算法,主要目的是使用計算機來處理數字和數值數據。
常見的數值算法包括:
數值積分 (Numerical Integration) :用近似方法計算定積分,例如梯形法、辛普森法、龍貝格法等。
數值微分 (Numerical Differentiation):用近似方法計算微分,例如前向差分、後向差分、中心差分等。
線性代數 (Linear Algebra):為求解線性方程組、求特徵值、特徵向量等線性代數問題所使用的數值算法,例如高斯消元法、LU分解、QR分解等。
插值 (Interpolation):根據已知數據點建立一個連續函數,例如拉格朗日插值、牛頓插值等。
最優化 (Optimization):尋找最小值或最大值的方法,例如梯度下降法、牛頓法等。
常微分方程式 (Ordinary Differential Equations):求解常微分方程式的數值方法,例如歐拉法、龍格-庫塔法等。
求根 (Root-finding):尋找函數零點的算法,例如二分法、牛頓法等。
舉例,將數值算法應用於股票市場,可以使用時間序列分析 (Time Series Analysis) 方法,將實時的股票數據轉換成對應的股票趨勢圖,並進行分析預測。另外,還可以使用聚類分析 (Cluster Analysis) 方法,將相似的股票分為一類,進而預測未來股票市場走勢。
數值積分算法:以數值方法逼近積分值,包括一維和多維積分算法。
數值微積分算法:以數值方法逼近導數和高階導數,包括有限差分、有限元素法等。
線性方程組求解算法:將線性方程組轉化為矩陣形式,以數值方法求解,包括高斯消元法、LU分解法等。
迭代解法:用迭代算法逼近解答,包括牛頓法、梯度下降法等。
正交多項式算法:以正交多項式為基函數,進行求解,包括勒讓德多項式、拉格朗日多項式等。
插值算法:以數值方法在已知數據點間進行逼近,包括線性插值、拉格朗日插值、牛頓插值等。
數值微分算法:以數值方法逼近微分值,包括一階和高階微分算法。
最小二乘算法:以最小化預測誤差為目標,進行數據擬合,包括線性最小二乘法、非線性最小二乘法等。
常微分方程數值解算法:以數值方法解常微分方程,包括歐拉方法、中點法、龍格-庫塔法等。
偏微分方程數值解算法:以數值方法求解偏微分方程,包括差分法、有限元法、蒙特卡羅法等。
答案:
def binary_search(arr, x):
l, r = 0, len(arr)-1
while l <= r:
mid = (l + r) // 2
if arr[mid] == x:
return mid
elif arr[mid] < x:
l = mid + 1
else:
r = mid - 1
return -1
print(binary_search([1, 2, 3, 4, 5], 3)) # output: 2
print(binary_search([1, 2, 3, 4, 5], 6)) # output: -1
答案:
def newton_method(f, df, x0, n_iterations):
x = x0
for i in range(n_iterations):
x = x - f(x)/df(x)
return x
f = lambda x: x**3 - x**2 + 2
df = lambda x: 3*x**2 - 2*x
print(newton_method(f, df, 1, 5)) # output: 0.855624760256968
答案:
def euler_method(f, x0, y0, h, n_iterations):
x, y = x0, y0
for i in range(n_iterations):
y += h * f(x, y)
x += h
return y
f = lambda x, y: x + y
print(euler_method(f, 0, 1, 0.1, 10)) # output: 2.6448088481707596
答案:
import numpy as np
def gaussian_elimination(a, b):
n = len(b)
for i in range(n):
max_index = i + np.argmax(abs(a[i:, i]))
a<a id='inlink0' class='inlink'>i, max_index</a> = a<a id='inlink1' class='inlink'>max_index, i</a>
b<a id='inlink2' class='inlink'>i, max_index</a> = b<a id='inlink3' class='inlink'>max_index, i</a>
for j in range(i+1, n):
factor = a[j, i] / a[i, i]
b[j] -= factor * b[i]
for k in range(i, n):
a[j, k] -= factor * a[i, k]
x = np.zeros(n)
for i in range(n-1, -1, -1):
x[i] = (b[i] - np.dot(a[i, i+1:], x[i+1:])) / a[i, i]
return x
a = np.array([[3, 2, -1],
[2, -2, 4],
[-1, 0.5, -1]])
b = np.array([1, -2, 0])
print(gaussian_elimination(a, b)) # output: [ 1. -2. -2.]
答案:
from sklearn import svm
X = [[0, 0], [1, 1], [1, 0]]
y = [0, 1, 1]
clf = svm.SVC(kernel='linear', C=1000)
clf.fit(X, y)
print(clf.predict(<a id='inlink4' class='inlink'>2, 2</a>)) # output: [1]