ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 灰袍法师

[原创] 用自定义函数+牛顿法,在平滑曲线散点图求两条曲线的交点,此法适用于很多其他情况

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-10-8 17:53 | 显示全部楼层
本帖已被收录到知识树中,索引项:自定义函数开发
①海底眼[原创] 揭开Excel平滑曲线的秘密
http://club.excelhome.net/thread-135621-1-1.html

②灰袍法师[原创] 用自定义函数+牛顿法,在平滑曲线散点图求两条曲线的交点,此法适用于很多其他情况
http://club.excelhome.net/thread-805428-1-1.html

③baomaboy[原创] 通用工程试验函数集V2.38(For_2003~2010)  
http://club.excelhome.net/thread-617843-1-1.html

经典之作,终于解决了我长期以来思考的难题,感谢你们,非常感谢!

TA的精华主题

TA的得分主题

发表于 2013-10-11 08:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
下载学习下

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-10-15 07:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 灰袍法师 于 2013-10-15 08:16 编辑
Excel2119 发表于 2013-10-8 17:53
①海底眼[原创] 揭开Excel平滑曲线的秘密
http://club.excelhome.net/thread-135621-1-1.html

er......我发现 海底眼 原先的自定义函数带有错误。

如果两个数据点非常接近,而其它数据点远离这两个接近的数据点,那么这两个 接近数据点之间 的插值就会出错。
比如原附件的第一个表,如果用以下数据画平滑曲线就会出现插值点不在曲线上:
2.00
2.80
3.60
5.00
5.00
6.00
0.00
4.00
4.00
0.00
5.00
4.00

出错图示如下:

出错图.jpg

查了半天,发现是这段代码有误,原帖海底眼的代码是:
在 FindFourBezierPoints 子过程里面的这段代码:

If ((d13 / 6 < d23 / 2) And (d24 / 6 < d23 / 2)) Then
    If (Dot1.x <> Dot2.x Or Dot1.y <> Dot2.y) Then OffsetTo2 = AmultiF(OffsetTo2, 1 / 6)
    If (Dot1.x = Dot2.x And Dot1.y = Dot2.y) Then OffsetTo2 = AmultiF(OffsetTo2, 1 / 3)
    If (Dot3.x <> Dot4.x Or Dot3.y <> Dot4.y) Then OffsetTo3 = AmultiF(OffsetTo3, 1 / 6)
    If (Dot3.x = Dot4.x And Dot3.y = Dot4.y) Then OffsetTo3 = AmultiF(OffsetTo3, 1 / 3)
ElseIf ((d13 / 6 >= d23 / 2) And (d24 / 6 >= d23 / 2)) Then
    OffsetTo2 = AmultiF(OffsetTo2, d23 / 12)
    OffsetTo3 = AmultiF(OffsetTo3, d23 / 12)
ElseIf (d13 / 6 >= d23 / 2) Then
    OffsetTo2 = AmultiF(OffsetTo2, d23 / 2 / d13)
    OffsetTo3 = AmultiF(OffsetTo3, d23 / 2 / d13)
ElseIf (d24 / 6 >= d23 / 2) Then
    OffsetTo2 = AmultiF(OffsetTo2, d23 / 2 / d24)
    OffsetTo3 = AmultiF(OffsetTo3, d23 / 2 / d24)
End If

要全部替换为以下正确代码:

If ((d13 / 6 < d23 / 2) And (d24 / 6 < d23 / 2)) Then
    If (Dot1.x <> Dot2.x Or Dot1.y <> Dot2.y) Then OffsetTo2 = AmultiF(OffsetTo2, 1 / 6)
    If (Dot1.x = Dot2.x And Dot1.y = Dot2.y) Then OffsetTo2 = AmultiF(OffsetTo2, 1 / 3)
    If (Dot3.x <> Dot4.x Or Dot3.y <> Dot4.y) Then OffsetTo3 = AmultiF(OffsetTo3, 1 / 6)
    If (Dot3.x = Dot4.x And Dot3.y = Dot4.y) Then OffsetTo3 = AmultiF(OffsetTo3, 1 / 3)
ElseIf ((d13 / 6 >= d23 / 2) And (d24 / 6 >= d23 / 2)) Then
    OffsetTo2 = AmultiF(AsubB(Dot3, Dot1), d23 / 2 / d13) '原有代码的这一句和下一句都错了。
    OffsetTo3 = AmultiF(AsubB(Dot2, Dot4), d23 / 2 / d24)
ElseIf (d13 / 6 >= d23 / 2) Then
    OffsetTo2 = AmultiF(AsubB(Dot3, Dot1), d23 / 2 / d13)
    OffsetTo3 = AmultiF(AsubB(Dot2, Dot4), d23 / 2 / d13)
ElseIf (d24 / 6 >= d23 / 2) Then
    OffsetTo2 = AmultiF(AsubB(Dot3, Dot1), d23 / 2 / d24)
    OffsetTo3 = AmultiF(AsubB(Dot2, Dot4), d23 / 2 / d24)
End If

这里是修改后的顶楼附件,用最新版本的 WinRAR 打开

数值牛顿法求解两条贝塞尔曲线的交点_改正原有代码插值错误的新版本.rar (37.93 KB, 下载次数: 411)

TA的精华主题

TA的得分主题

发表于 2015-3-31 14:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 Excel2119 于 2015-3-31 14:55 编辑

谢谢  灰袍法师
此问题,我在“[baomaboy 通用工程试验函数集V2.38(For_2003~2010) ”【http://club.excelhome.net/thread-617843-1-1.html】帖子中提过,谢谢  灰袍法师 的修改

TA的精华主题

TA的得分主题

发表于 2015-11-20 17:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
灰袍法师 发表于 2013-10-15 07:53
er......我发现 海底眼 原先的自定义函数带有错误。

如果两个数据点非常接近,而其它数据点远离这两个 ...

是否方便把两条曲线的函数分别输出到单元格,谢谢。

TA的精华主题

TA的得分主题

发表于 2021-8-5 21:10 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-4-10 17:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
灰袍法师 发表于 2013-10-15 07:53
er......我发现 海底眼 原先的自定义函数带有错误。

如果两个数据点非常接近,而其它数据点远离这两个 ...

海底眼的方法没有办法自动计算出所有的点,制定的节点意义不大,如果有100个数据点,指点X, 求Y呢? 都不是单调的函数,都是多对多的函数怎么办呢?

TA的精华主题

TA的得分主题

发表于 2023-5-5 20:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
厉害了!!!

TA的精华主题

TA的得分主题

发表于 2023-5-5 22:06 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-5-9 10:39 | 显示全部楼层
灰袍法师 发表于 2012-3-16 19:13
我自己没发现有何问题吖?你截个屏,或者上传有问题的附件看看。
哦,原有附件确实不能在Excel2003运行
...

法师,是否能帮忙看看我帖子的疑问,应该有点难,不知道你能否帮忙看看~,跪谢·
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-5 20:48 , Processed in 0.046148 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表