根据已知坐标点画椭圆曲线

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize

# 输入坐标点数据
x_data = np.array([3.941480293, 3.475033914, 3.073941549, 2.805914826, 2.734021537,
                   2.942555288, 3.354419877, 3.937493254, 4.441122968, 4.998814452,
                   5.490826688, 5.911054241, 6.336517315, 6.774639331, 7.146489382,
                   7.42027032, 7.434313787, 7.155838222, 6.594675284, 6.009223856,
                   5.487949163, 4.960735454, 4.425830988])
y_data = np.array([4.074905924, 3.591903876, 3.042621541, 2.485151431, 1.78094537,
                   1.409438513, 1.21628921, 1.218700552, 1.347703702, 1.587670099,
                   1.875068964, 2.178580205, 2.549639346, 3.023493594, 3.555617652,
                   4.194067893, 4.810987605, 5.191017166, 5.342526898, 5.267524226,
                   5.089825813, 4.825749131, 4.474423764])

# 定义椭圆参数化函数
def custom_ellipse(params, x):
    h, k, a, b, theta = params
    angle = np.radians(theta)
    x_rotated = (x - h) * np.cos(angle) + (y_data - k) * np.sin(angle)
    y_rotated = (y_data - k) * np.cos(angle) - (x - h) * np.sin(angle)
    return ((x_rotated / a) ** 2 + (y_rotated / b) ** 2 - 1)

# 初始参数估计值
params_initial = (5, 3, 4, 2, -45)

# 优化椭圆参数以最小化残差
result = minimize(lambda params: np.sum(custom_ellipse(params, x_data) ** 2), params_initial, method='Nelder-Mead')

# 获取最优参数
params_optimal = result.x

# 解析最优参数
h, k, a, b, theta = params_optimal

# 计算椭圆的一般多项式方程的系数
A = (np.cos(np.radians(theta)) ** 2) / (a ** 2) + (np.sin(np.radians(theta)) ** 2) / (b ** 2)
B = 2 * ((np.sin(np.radians(theta)) * np.cos(np.radians(theta))) / (a ** 2) - (np.sin(np.radians(theta)) * np.cos(np.radians(theta))) / (b ** 2))
C = (np.sin(np.radians(theta)) ** 2) / (a ** 2) + (np.cos(np.radians(theta)) ** 2) / (b ** 2)
D = -2 * A * h - B * k
E = -B * h - 2 * C * k
F = A * (h ** 2) + B * h * k + C * (k ** 2) - 1

# 输出椭圆的一般多项式方程
print("椭圆的一般多项式方程:")
print(f"{A:.6f}x^2 + {B:.6f}xy + {C:.6f}y^2 + {D:.6f}x + {E:.6f}y + {F:.6f} = 0")

# 绘制描点连线法得到的椭圆
t = np.linspace(0, 2 * np.pi, 100)
x_fit = h + a * np.cos(t) * np.cos(np.radians(theta)) - b * np.sin(t) * np.sin(np.radians(theta))
y_fit = k + a * np.cos(t) * np.sin(np.radians(theta)) + b * np.sin(t) * np.cos(np.radians(theta))

# 绘制原始数据和拟合结果
plt.scatter(x_data, y_data, label='Data Points', color='blue')
plt.plot(x_fit, y_fit, label='Fitted Ellipse', color='red')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.gca().set_aspect('equal', adjustable='box')  # 设置坐标轴比例为等比例

# 输出拟合结果
print("Center (h, k):", h, k)
print("Semi-major axis (a):", a)
print("Semi-minor axis (b):", b)
print("Rotation angle (theta):", theta)

# 显示拟合结果
plt.show()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,如果你想使用Python来根据已知坐标画三维图,可以使用Matplotlib库中的mplot3d模块。以下是具体步骤: 1. 导入需要的库和模块,包括numpy和mplot3d。代码如下: ```python import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D ``` 2. 定义已知的三维坐标。假设有3个分别为(1,2,3),(4,5,6),(7,8,9)。代码如下: ```python x = np.array([1, 4, 7]) y = np.array([2, 5, 8]) z = np.array([3, 6, 9]) ``` 3. 创建一个3D图形,并将已知坐标添加到图形中。代码如下: ```python fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(x, y, z) ``` 4. 可以通过设置坐标轴的范围和标签来调整图形的显示。代码如下: ```python ax.set_xlabel('X Label') ax.set_ylabel('Y Label') ax.set_zlabel('Z Label') ax.set_xlim([0, 10]) ax.set_ylim([0, 10]) ax.set_zlim([0, 10]) ``` 5. 最后,使用plt.show()函数显示图形。代码如下: ```python plt.show() ``` 完整的代码如下: ```python import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 定义已知坐标 x = np.array([1, 4, 7]) y = np.array([2, 5, 8]) z = np.array([3, 6, 9]) # 创建3D图形 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 将已知添加到图形中 ax.scatter(x, y, z) # 设置坐标轴范围和标签 ax.set_xlabel('X Label') ax.set_ylabel('Y Label') ax.set_zlabel('Z Label') ax.set_xlim([0, 10]) ax.set_ylim([0, 10]) ax.set_zlim([0, 10]) # 显示图形 plt.show() ``` 运行代码后,将会显示一个包含已知三维的散图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值