尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

找出数组中驻点和拐点

找出数组中驻点和拐点
📅 发布时间:2026/6/20 11:51:48

找出数组中驻点和拐点,即一阶导数为零点和二阶导数为零点。代码定义了两个函数:find_first_deriv_zeros和find_second_deriv_zeros,用于找到一阶和二阶导数的零点索引。主函数中有一个示例数据数组,并调用这两个函数来输出零点的索引。
注意:边界点的处理可能需要特别考虑。例如,一阶导数的左边界使用前向差分,右边界使用后向差分,而中间点使用中心差分。同样,二阶导数的计算也需要处理边界点。

// stdafx.cpp : 只包括标准包含文件的源文件 // ConsoleApplication1.pch 将作为预编译头 // stdafx.obj 将包含预编译类型信息 #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <time.h> #include <Windows.h> #include <math.h> #define EPSILON 1e-6 // 判断导数为零的阈值 #define MAX_DATA 1000 // 最大数据长度 // 计算一阶导数并返回零点索引 void compute_derivatives(float *data, int n, float *first_deriv, float *second_deriv, int *first_zeros, int *first_count, int *second_zeros, int *second_count) { *first_count = 0; *second_count = 0; if (n < 2) return; // 处理一阶导数 for (int i = 0; i < n; i++) { if (i == 0) { // 左边界前向差分 first_deriv[i] = (data[1] - data[0]) / 1.0f; } else if (i == n-1) { // 右边界后向差分 first_deriv[i] = (data[i] - data[i-1]) / 1.0f; } else { // 中心差分 first_deriv[i] = (data[i+1] - data[i-1]) / 2.0f; } } // 改进的一阶导数零点检测:检查符号变化 for (int i = 0; i < n-1; i++) { // 检查一阶导数是否变号 if (first_deriv[i] * first_deriv[i+1] < 0) { // 一阶导数变号,说明此处有极值点 // 记录i和i+1中函数值更大的点(假设是极大值) int idx = (data[i] > data[i+1]) ? i : i+1; first_zeros[(*first_count)++] = idx; } else if (fabs(first_deriv[i]) < EPSILON) { // 一阶导数恰好为0(平坦区域),直接记录 first_zeros[(*first_count)++] = i; } } // 处理二阶导数 for (int i = 0; i < n; i++) { if (i == 0 || i == n-1) { // 边界使用前向/后向差分 second_deriv[i] = (2.0f*data[i] - 5.0f*data[i+1] + 4.0f*data[i+2] - data[i+3]) / 1.0f; } else if (i == 1) { // 近边界特殊处理 second_deriv[i] = (data[i+1] - 2.0f*data[i] + data[i-1]) / 1.0f; } else if (i == n-2) { // 近边界特殊处理 second_deriv[i] = (data[i+2] - 2.0f*data[i+1] + data[i]) / 1.0f; } else { // 中心差分 second_deriv[i] = (data[i+1] - 2.0f*data[i] + data[i-1]) / 1.0f; } // 记录零点 if (fabs(second_deriv[i]) < EPSILON) { second_zeros[(*second_count)++] = i; } } } int main() { // 示例数据(假设步长h=1) float data[] = {911, 914, 916, 918, 920, 922, 924, 926, 928, 930, 932, 934, 936, 938, 940, 942, 942, 939}; int n = sizeof(data)/sizeof(data[0]); // 导数存储数组 float first_deriv[MAX_DATA] = {0}; float second_deriv[MAX_DATA] = {0}; // 零点索引数组 int first_zeros[MAX_DATA] = {0}; int second_zeros[MAX_DATA] = {0}; int count1 = 0, count2 = 0; // 计算导数和零点 compute_derivatives(data, n, first_deriv, second_deriv, first_zeros, &count1, second_zeros, &count2); // 打印导数信息 printf("索引\t值\t一阶导数\t二阶导数\n"); printf("=====================================\n"); for(int i=0; i<n; i++) { printf("%d\t%.4f\t%.6f\t\t%.6f\n", i, data[i], first_deriv[i], second_deriv[i]); } // 打印零点信息 printf("\n一阶导数零点(驻点)索引: "); for(int i=0; i<count1; i++) printf("%d ", first_zeros[i]); printf("\n二阶导数零点(拐点)索引: "); for(int i=0; i<count2; i++) printf("%d ", second_zeros[i]); return 0; }

相关新闻

  • 代码漏洞藏隐患?Java安全防护神器,分钟级闭环修复
  • GLM-4.7编程环境10分钟搭建指南:3种官方配置方法,实测有效,一键即用!
  • YOLOv8如何实现旋转框检测功能?

最新新闻

  • 200+专业动作库:如何为你的游戏角色注入生命力
  • 大平层装修选购指南:如何挑选靠谱设计与装修服务 - 速递信息
  • 如何用Nucleus Co-Op实现单机游戏4人分屏:技术原理与实战配置指南
  • developer-portfolio 扩展指南:添加博客、作品集和联系表单
  • 2026扬州大平层定制怎么选不踩坑 爱格授权本地品牌该怎么辨别 - 十大品牌排行榜
  • 2026年扬州全屋定制持证爱格授权门店合集 - 高定

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号