【无标题】python数学建模算法与应用第2章课后习题
ax1.plot_surface(X, Y, -Z1, cmap='viridis', alpha=0.6)# 画出双面。fig, axs = plt.subplots(2, 3, figsize=(15, 10))# 创建2行3列的子窗口。circle_y = np.ones_like(circle_x)# 创建一个全为1的数组,表示y=1。ax1.set_title('单叶双曲面: x²/4
#2.1
import numpy as np
import matplotlib.pyplot as plt
# 定义 x 的范围
x = np.linspace(-2, 2, 400)
# 计算各个函数的 y 值
y_chx = np.cosh(x)
y_shx = np.sinh(x)
y_exp_scaled = 0.5 * np.exp(x)
# 创建图形
plt.figure(figsize=(10, 6))
# 绘制 y = chx
plt.plot(x, y_chx, label='y = ch(x)', color='blue')
# 绘制 y = shx
plt.plot(x, y_shx, label='y = sh(x)', color='red')
# 绘制 y = 0.5 * e^x
plt.plot(x, y_exp_scaled, label='y = 0.5 * e^x', color='green')
# 添加标题和标签
plt.title('Functions: y = ch(x), y = sh(x), y = 0.5 * e^x')
plt.xlabel('x')
plt.ylabel('y')
# 添加图例
plt.legend()
# 显示图形
plt.grid(True)
plt.show()

#2.2
from scipy.special import gamma
import pylab as plt
import numpy as np
plt.rc('text',usetex=True)
x=np.linspace(-5,5,100)
plt.plot(x,gamma(x),c='k')
plt.xlabel('$x$')
plt.ylabel('$\Gamma(x)$');plt.show()
#2.3
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10, 10, 400) # 生成x坐标
for k in range(1, 7):
y = k * x**2 + 2 * k
plt.plot(x, y, label=f'y={k}x²+2{k}')
plt.xlabel('x')
plt.ylabel('y')
plt.title('曲线图')
plt.legend()
plt.grid(True)
plt.show()

#2.4
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10, 10, 400)
fig, axs = plt.subplots(2, 3, figsize=(15, 10)) # 创建2行3列的子窗口
axs = axs.flatten() # 将子窗口数组展平,方便遍历
for k in range(1, 7):
y = k * x**2 + 2 * k
axs[k-1].plot(x, y)
axs[k-1].set_title(f'y={k}x²+2{k}')
axs[k-1].grid(True)
plt.tight_layout()
plt.show()

#2.5
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 定义范围和网格
x = np.linspace(-10, 10, 400)
y = np.linspace(-10, 10, 400)
X, Y = np.meshgrid(x, y)
# 单叶双曲面: x²/4 + y²/10 - z²/8 = 1
# 改写为 z² = 8 * (x²/4 + y²/10 - 1)
Z1 = np.sqrt(8 * (X**2 / 4 + Y**2 / 10 - 1))
# 椭圆抛物面: z = x²/4 + y²/6
Z2 = X**2 / 4 + Y**2 / 6
fig = plt.figure(figsize=(14, 7))
# 单叶双曲面
ax1 = fig.add_subplot(1, 2, 1, projection='3d')
ax1.plot_surface(X, Y, Z1, cmap='viridis', alpha=0.6)
ax1.plot_surface(X, Y, -Z1, cmap='viridis', alpha=0.6) # 画出双面
ax1.set_title('单叶双曲面: x²/4 + y²/10 - z²/8 = 1')
ax1.set_xlabel('X')
ax1.set_ylabel('Y')
ax1.set_zlabel('Z')
# 椭圆抛物面
ax2 = fig.add_subplot(1, 2, 2, projection='3d')
ax2.plot_surface(X, Y, Z2, cmap='inferno')
ax2.set_title('椭圆抛物面: z = x²/4 + y²/6')
ax2.set_xlabel('X')
ax2.set_ylabel('Y')
ax2.set_zlabel('Z')
plt.tight_layout()
plt.show()
#2.7
import numpy as np
# 方程组 1(有无穷多解)
A1 = np.array([[4, 2, -1],
[3, -1, 2],
[11, 3, 0]])
b1 = np.array([2, 10, 8])
# 使用最小二乘法求解方程组 1 的解
x1, residuals, rank, s = np.linalg.lstsq(A1, b1, rcond=None)
print("方程组 1 最小二乘解:", x1)
# 方程组 2(唯一解)
A2 = np.array([[2, 3, 1],
[1, -2, 4],
[3, 8, -2],
[4, -1, 9]])
b2 = np.array([4, -5, 13, -6])
# 使用最小二乘法求解方程组 2 的解(由于方程数多于未知数)
x2, residuals, rank, s = np.linalg.lstsq(A2, b2, rcond=None)
print("方程组 2 最小二乘解:", x2)
#2.8
import numpy as np
from numpy.linalg import inv
a=4*np.eye(1000)+np.eye(1000,k=-1)+np.eye(1000,k=1)
b=np.arange(1,1001).reshape(1000,1)
x=inv(a)@b;print(x)
#2.9
import sympy as sp
# 定义符号
x, y = sp.symbols('x y')
# 定义方程
eq1 = x**2 - y - x - 3
eq2 = x - 3
eq3 = y - 2
# 求解方程组
solutions = sp.solve([eq1, eq2, eq3], (x, y))
print("Symbolic solution:", solutions)
#2.10
import numpy as np
import matplotlib.pyplot as plt
# 绘制上半部分(抛物线部分)
y = np.linspace(1, 3, 400)
x = np.sqrt(4*y - y**2)
plt.plot(x, y, 'b-', lw=2, label='Upper Part (Parabola)')
plt.plot(-x, y, 'b-', lw=2)
# 绘制下半部分(半球部分,但只显示其轮廓在y=1处的圆)
circle_x = np.linspace(-2, 2, 400)
circle_y = np.ones_like(circle_x) # 创建一个全为1的数组,表示y=1
plt.plot(circle_x, circle_y, 'r-', lw=2, label='Lower Part (Circle at y=1)')
# 为了更清楚地看到圆,我们可以稍微增加它的半径并绘制一个虚线圆
# 注意:这只是一个视觉辅助,不是容器的实际部分
expanded_circle_x = 2.2 * np.cos(np.linspace(0, 2*np.pi, 400))
expanded_circle_y = 1.2 * np.ones_like(expanded_circle_x)
plt.plot(expanded_circle_x, expanded_circle_y, 'r--', lw=1)
# 设置坐标轴范围和标签
plt.xlim(-3, 3)
plt.ylim(0, 3.5)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Container Cross-Section')
plt.legend()
plt.axis('equal') # 确保x轴和y轴比例相同
plt.grid(True)
plt.show()
import numpy as np
import scipy.integrate as spi
def radius(y):
return np.sqrt(4*y - y**2)
def volume_paraboloid(y):
return 2 * np.pi * y * radius(y)
V_paraboloid, _ = spi.quad(volume_paraboloid, 1, 3)
V_hemisphere = (1/2) * (4/3) * np.pi * 2**3
print(f"容器的体积(只考虑抛物面部分): {V_paraboloid}")
print(f"半球面部分(0≤y≤1)的体积: {V_hemisphere}")

#2.11
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import fsolve
# 定义 f(x) 和 g(x)
def f(x):
return (np.abs(x + 1) - np.abs(x - 1)) / 2 + np.sin(x)
def g(x):
return (np.abs(x + 3) - np.abs(x - 3)) / 2 + np.cos(x)
# 定义方程组
def equations(x):
return [f(x), g(x)]
# 多次尝试不同的初始猜测
initial_guesses = [-5, -1, 0, 1, 5]
solutions = []
for guess in initial_guesses:
try:
sol = fsolve(equations, guess)
# 验证解是否符合要求
if np.allclose(equations(sol), [0, 0]):
solutions.append(sol[0])
except Exception as e:
print(f"Error with initial guess {guess}: {e}")
# 去重并输出解决方案
solutions = np.unique(solutions)
print("Numerical solutions:", solutions)
# 可视化 f(x) 和 g(x)
x = np.linspace(-10, 10, 400)
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(x, f(x), label='$f(x)$')
plt.axhline(0, color='black', linewidth=0.5)
plt.title('$f(x)$')
plt.xlabel('$x$')
plt.ylabel('$f(x)$')
plt.grid(True)
plt.subplot(1, 2, 2)
plt.plot(x, g(x), label='$g(x)$', color='orange')
plt.axhline(0, color='black', linewidth=0.5)
plt.title('$g(x)$')
plt.xlabel('$x$')
plt.ylabel('$g(x)$')
plt.grid(True)
plt.tight_layout()
plt.show()

#2.12
import sympy as sp
# 定义符号矩阵
A = sp.Matrix([[-1, 1, 0],
[-4, 3, 0],
[1, 0, 2]])
# 计算特征值和特征向量
eigenvalues = A.eigenvals()
eigenvectors = A.eigenvects()
print("特征值:", eigenvalues)
print("特征向量:", eigenvectors)

#2..13
import numpy as np
from scipy.optimize import least_squares
# 定义函数
f = lambda x: (abs(x + 1) - abs(x - 1)) / 2 + np.sin(x)
g = lambda x: (abs(x + 3) - abs(x - 3)) / 2 + np.cos(x)
# 定义方程组
eqs = lambda z: [
3 * f(z[2]) + 4 * g(z[3]) - 1 - 2 * z[0],
2 * f(z[2]) + 6 * g(z[3]) - 2 - 3 * z[1],
f(z[0]) + 3 * g(z[1]) - 3 - z[2],
4 * f(z[0]) + 6 * g(z[1]) - 1 - 5 * z[3],
f(z[3]) + g(z[1]) - 2 - z[0] - z[2],
2 * f(z[0]) - 10 * g(z[2]) - 5 - z[1] - 3 * z[3]
]
# 初始猜测值
initial_guess = np.array([1.0, 1.0, 1.0, 1.0]) # 可以根据问题调整
# 使用 least_squares 求解方程组
result = least_squares(eqs, initial_guess)
# 打印结果
print(result.x)

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)