当前位置: 首页 > article >正文

python求两条曲线的边界线

问题描述:

已知两个平面曲线点集,一个取自y=x**2-2,x的区间为[-4,4],此点集存在列表X1,Y1中,另外一个取自y=-2*x,x的区间为[-5,5],此点集存在列表X2,Y2中,两条曲线将平面分成几个部分,现在要求两条曲线下面空间的边界线(包络线)。

方法:

为了找到两条离散曲线下的边界线,我们可以使用一种贪心算法,从左到右扫描,对于每个x值,我们检查两条曲线上的y值,选择较低的那个作为边界线上的点。由于两条曲线是离散的,同一个x值可能不对应两条曲线上的点,所以我们需要对曲线进行插值,以确保我们可以在任意x值上找到边界线上的点。

代码实现:

import numpy as npimport matplotlib.pyplot as pltfrom scipy.interpolate import interp1d# 定义x的区间和对应的y值x1 = np.linspace(-4, 4, 400)y1 = x1**2 - 2x2 = np.linspace(-5, 5, 400)y2 = -2 * x2# 创建插值函数interp_y1 = interp1d(x1, y1, kind='cubic', fill_value='extrapolate')interp_y2 = interp1d(x2, y2, kind='cubic', fill_value='extrapolate')# 定义一个较大的x区间用于扫描x_scan = np.linspace(min(min(x1), min(x2)), max(max(x1), max(x2)), 1000)# 找到边界线上的点y_boundary = np.zeros_like(x_scan)for i, x in enumerate(x_scan):    y_boundary[i] = min(interp_y1(x), interp_y2(x))# 绘制曲线和边界线plt.figure(figsize=(8, 6))plt.plot(x1, y1, label='y = x**2 - 2')plt.plot(x2, y2, label='y = -2*x')plt.plot(x_scan, y_boundary, label='Boundary Line', color='red')# 标记出边界线上的点plt.plot(x_scan, y_boundary, 'ro')plt.legend()plt.xlabel('x')plt.ylabel('y')plt.title('Boundary Line between Two Curves')plt.grid(True)plt.show()

优化后:

在下面优化后的代码中,我们使用 np.minimum 函数一次性比较了 interp_y1(x_scan) 和 interp_y2(x_scan) 的结果,从而避免了循环。这种方法利用了NumPy的向量化操作,可以显著提高性能,因为它减少了Python层面的循环,并利用了底层的优化。

此外,我们移除了 np.zeros_like 的使用,因为 np.minimum 函数直接返回了一个包含所需结果的数组。

import numpy as npimport matplotlib.pyplot as pltfrom scipy.interpolate import interp1d# 定义x的区间和对应的y值x1 = np.linspace(-4, 4, 400)y1 = x1**2 - 2x2 = np.linspace(-5, 5, 400)y2 = -2 * x2# 创建插值函数interp_y1 = interp1d(x1, y1, kind='cubic', fill_value='extrapolate')interp_y2 = interp1d(x2, y2, kind='cubic', fill_value='extrapolate')# 定义一个较大的x区间用于扫描x_scan = np.linspace(min(min(x1), min(x2)), max(max(x1), max(x2)), 1000)# 向量化地找到边界线上的点y_boundary = np.minimum(interp_y1(x_scan), interp_y2(x_scan))# 绘制曲线和边界线plt.figure(figsize=(8, 6))plt.plot(x1, y1, label='y = x**2 - 2')plt.plot(x2, y2, label='y = -2*x')plt.plot(x_scan, y_boundary, label='Boundary Line', color='red')# 标记出边界线上的点plt.plot(x_scan, y_boundary, 'ro')plt.legend()plt.xlabel('x')plt.ylabel('y')plt.title('Boundary Line between Two Curves')plt.grid(True)plt.show()


http://www.kler.cn/a/298794.html

相关文章:

  • 机器学习系列(一)——K-近邻算法
  • “乡村探索者”:村旅游网站的移动应用开发
  • linux命令中cp命令-rf与-a的差别
  • 面向对象编程概念
  • 如何在谷歌浏览器中进行网络速度测试
  • 007-spring-bean的相关配置(重要)
  • 什么是过压保护?常见的过压保护元器件有哪些?
  • 零基础国产GD32单片机编程入门(十三)单片机IAP(在应用编程)详解及实战源码
  • 基于MicroPython的ESP8266控制舵机的设计方案
  • 继承QWidget样式表无效的
  • Learn ComputeShader 10 HUD Overlay
  • Android13 Hotseat客制化--去掉hotseat(热座)
  • tushare库获取金融股票数据
  • 如何使用Filter(过滤器一)
  • discuz论坛3.4 截图粘贴图片发帖后显示不正常问题
  • Java 利用ASM读取变量值(Field value)问题研究
  • 2024级新生数组字符串专题题解
  • Docker 容器技术在简化 MySQL 主从复制部署与优化
  • 快速入门游戏领域,开发游戏需要哪些技术?
  • Lua垃圾回收机制
  • 跨境网红营销SOP流程1.0丨出海笔记
  • 博科测试IPO上市关注:创新驱动发展,加速技术成果转化
  • 使用datax从mysql导入数据到taosdb中
  • Vue框架学习笔记-9
  • Android12——Launcher3文件夹布局修改调整
  • 鸿蒙HarmonyOS应用开发者高级认证重点知识详解