7

..3017發表於2024-11-18

7.1

點選檢視程式碼
#學號17
import numpy as np
import scipy.interpolate as spi
import scipy.integrate as spi_integrate

def g(x):
    return ((3*x**2 + 4*x + 6) * np.sin(x)) / (x**2 + 8*x + 6)
x_values = np.linspace(0, 10, 1000)
y_values = g(x_values)
spline = spi.CubicSpline(x_values, y_values)
def h(x):
    return spline(x)
integral_g, _ = spi_integrate.quad(g, 0, 10)

x_fine = np.linspace(0, 10, 10000)

y_fine = h(x_fine)

integral_h = np.trapz(y_fine, x_fine)

print(f"積分 g(x) 從 0 到 10 的結果: {integral_g}")
print(f"積分 h(x) 從 0 到 10 的結果: {integral_h}")

7.3

點選檢視程式碼
#學號17
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d, CubicSpline

T = np.array([700, 720, 740, 760, 780])
V = np.array([0.0977, 0.1218, 0.1406, 0.1551, 0.1664])

T_interp = np.array([750, 770])

f_linear = interp1d(T, V, kind='linear')
V_linear_interp = f_linear(T_interp)

cs = CubicSpline(T, V)
V_cubic_interp = cs(T_interp)

print(f"線性插值結果: T={T_interp} 對應的 V={V_linear_interp}")
print(f"三次樣條插值結果: T={T_interp} 對應的 V={V_cubic_interp}")

x = np.linspace(700, 780, 400)

plt.figure(figsize=(10, 6))
plt.plot(T, V, 'o', label='原始資料點')
plt.plot(x, f_linear(x), '-', label='線性插值')
plt.plot(x, cs(x), '--', label='三次樣條插值')
plt.scatter(T_interp, V_linear_interp, color='red', label='線性插值點')
plt.scatter(T_interp, V_cubic_interp, color='green', label='三次樣條插值點')
plt.xlabel('溫度 T')
plt.ylabel('體積 V')
plt.title('過熱蒸汽體積隨溫度變化的插值')
plt.legend()
plt.grid(True)
plt.show()



7.4

點選檢視程式碼
#學號17
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata

def f(x, y):
    x2 = x**2
    return (x2 - 2*x) * np.exp(-x2 - y**2 - x*y)

x_min, x_max = -3, 3
y_min, y_max = -4, 4

num_points = 1000
x_random = np.random.uniform(x_min, x_max, num_points)
y_random = np.random.uniform(y_min, y_max, num_points)

z_random = f(x_random, y_random)

grid_x, grid_y = np.mgrid[x_min:x_max:100j, y_min:y_max:100j]

grid_z = griddata((x_random, y_random), z_random, (grid_x, grid_y), method='cubic')

plt.figure(figsize=(10, 8))
plt.contourf(grid_x, grid_y, grid_z, levels=50, cmap='viridis')  # 使用等高線圖填充
plt.colorbar(label='f(x, y)')
plt.scatter(x_random, y_random, c='red', s=10, label='隨機散亂點')  # 繪製隨機散亂點
plt.title('函式f(x, y)的插值結果')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True)
plt.show()

7.7

點選檢視程式碼
#學號17
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit, leastsq, least_squares
from scipy.constants import e

def g(x, a, b):
    return (10 * a) / (10 * b + (a - 10 * b) * np.exp(a * np.sin(x)))

a = 1.1
b = 0.01

x_values = np.arange(1, 21)
y_values = g(x_values, a, b)

for i, (xi, yi) in enumerate(zip(x_values, y_values), start=1):
    print(f"({xi}, {yi:.6f})")

popt_curve_fit, pcov_curve_fit = curve_fit(g, x_values, y_values, p0=[a, b])
y_fit_curve_fit = g(x_values, *popt_curve_fit)

def func_leastsq(params, x, y):
    return y - g(x, *params)

popt_leastsq = leastsq(func_leastsq, [a, b], args=(x_values, y_values))[0]
y_fit_leastsq = g(x_values, *popt_leastsq)

popt_least_squares = least_squares(func_leastsq, [a, b], args=(x_values, y_values)).x
y_fit_least_squares = g(x_values, *popt_least_squares)

print("\ncurve_fit parameters:", popt_curve_fit)
print("leastsq parameters:", popt_leastsq)
print("least_squares parameters:", popt_least_squares)

plt.figure(figsize=(10, 6))
plt.scatter(x_values, y_values, label='Simulated data', color='red')
plt.plot(x_values, y_fit_curve_fit, label='curve_fit', linestyle='-')
plt.plot(x_values, y_fit_leastsq, label='leastsq', linestyle='--')
plt.plot(x_values, y_fit_least_squares, label='least_squares', linestyle='-.')
plt.xlabel('x')
plt.ylabel('g(x)')
plt.legend()
plt.title('Fitting of g(x) using curve_fit, leastsq, and least_squares')
plt.grid(True)
plt.show()

相關文章