首页 > 编程问答 >确定非连续函数的根搜索中的发散点

确定非连续函数的根搜索中的发散点

时间:2024-08-07 15:15:03浏览次数:12  
标签:python math numerical-methods

我需要为一个函数实现一个根搜索算法,该算法可能有一些(不可移除的)分歧点(DP)/奇点,例如 f(x) = x**2 * np.tan(x)

问题是,通常的条件

f(x1)*f(x2) < 0 表示区间 [x1, x2]

内的根不能应用于不连续函数。如果对上述函数执行此操作,算法会将 DP 识别为根。

我尝试通过此标准将 DP 与根区分开:

# assume x1, x2 as interval points identified by the f(x1)*f(x2) < 0 condition
x3 = (x1+x2)/2
f1, f2, f3 = f(x1), f(x2), f(x3)
if abs(f1-f2) < (abs(f1-f3)+abs(f2-f3))*0.9999999999999:
    print("DP possibly found")

这对我来说有点麻烦(而且可能也不正确,因为这很大程度上取决于计算的精度)。我放在那里 0.9999999999999 只是为了避免可能的数字错误,但有时操作数之间的差异可能非常小。

(该标准的想法是,如果函数是非单调的,则可能存在 DP。单调性检查只是边缘处的函数值的距离应该与左侧和中心以及中心和右侧的函数值的距离之和相同我知道一些(病态的)例子可能会错误地识别DP,但我认为。 )

那么, 识别 DP 的正确/更好的方法是什么?

如果可能的话,我正在寻找一种没有外部模块(例如 sympy )的解决方案。

I将我的测试代码发布为 MWE here (它有点长,主要是由于文档字符串)。

有一个类似的问题,但似乎没有人在那里回答得很好(接受的答案是错误的): 求函数的根但不求渐近线


确定不连续函数中根查找的发散点(DP)可能很棘手,并且通常比检查符号变化更复杂。你当前的方法(试图分析局部行为)是正确的,但是正如你所承认的,它可能很脆弱,并且高度依赖于所选的公差和函数的特定属性。

以下是你可以用来更稳健地识别 DP 的一些更强大的方法:

1. 基于导数的方法:

  • 检查导数的符号变化: 在 DP 附近,函数的导数(斜率)通常会改变符号。你可以通过在当前区间 [x1, x2] 内计算几个点的导数来数值计算并检查导数的符号变化。如果检测到符号变化,则它表示 DP 的潜在存在。
  • 检查导数的幅度: DP 通常表现出导数的大幅度值。设置一个阈值,如果导数的绝对值超过该阈值,则你可以将该点标记为潜在的 DP。

2. 基于极限的方法:

  • 接近可疑点: 不是直接评估 DP 处的函数,而是尝试从两侧接近它。例如,如果你的区间是 [x1, x2] ,并且怀疑 x2 处有一个 DP,则计算 f(x2 - ε) f(x2 + ε) ,其中 ε 是一个很小的数字。如果这两个值之间存在显著差异或趋于无穷,则它表明存在 DP。

3. 结合领域知识:

  • 分析你的函数: 通常,你知道正在处理的函数类型。利用这些知识来识别潜在的 DP。例如,你知道 tan(x) x = (2n + 1)π/2 处有 DP,其中 n 是一个整数。
  • 排除已知的 DP: 如果可能,请修改你的根查找算法以排除或在已知的 DP 附近小心操作。

提高鲁棒性的技巧:

  • 自适应步长: 使用自适应步长算法(如布伦特方法或 Ridders 方法),它们可以更好地处理不连续性。这些方法根据函数的行为调整搜索区间的步长大小。
  • 多方法: 结合不同的方法来提高 DP 检测的置信度。例如,你可以将基于导数的检查与基于极限的方法结合起来。

你的代码示例的改进:

你的代码可以通过检查函数值是否超过某个阈值来改进,而不是依赖于差异:

import numpy as np

def has_divergence_point(f, x1, x2, threshold=1e6):
    """检查区间 [x1, x2] 内是否存在潜在的发散点。

    Args:
        f: 函数。
        x1: 区间的下限。
        x2: 区间的上限。
        threshold: 用于检测发散的阈值。

    Returns:
        如果检测到发散点,则为 True,否则为 False。
    """
    x3 = (x1 + x2) / 2
    f1, f2, f3 = f(x1), f(x2), f(x3)
    return (
        np.abs(f1) > threshold
        or np.abs(f2) > threshold
        or np.abs(f3) > threshold
    )

# 示例用法
def f(x):
    return x**2 * np.tan(x)

x1 = 1.0
x2 = 3.0

if has_divergence_point(f, x1, x2):
    print(f"区间 [{x1}, {x2}] 中可能存在一个发散点。")
else:
    print(f"区间 [{x1}, {x2}] 中没有找到发散点。")

请记住,没有一种方法可以保证在所有情况下都能完美地检测到 DP。为你的特定问题和函数选择最合适的方法的组合至关重要。

标签:python,math,numerical-methods
From: 78840039

相关文章

  • 将普通 python 文件导入另一个文件时出现 AttributeError
    我是新手。我正在尝试将简单的python文件导入到我的主文件中。相同的代码在我的mac上工作,但在我的电脑上不起作用。我不断收到此错误消息。“AttributeError:模块‘logo’没有属性‘hammer_logo’”第一个文件拍卖.py代码importlogoprint(logo.hammer_logo)第......
  • 使用python读取mysql数据,并记录到本地的文件中
    上次写过一次读取sqlserver数据,写入本地文件。今天分享一下mysql的。原理相似,希望对大家有小小的帮忙PS,我是3.6.13版本python,上一版本用包mysql-connector,一直不成功,查询官方文档,发现这个版本的PYTHON简直是奇葩的存在了。基本所有版本都支持,就是几个小版本排除在外了。......
  • python合并音视频-通过moviepy模块合并音视频
    ......
  • esp32安装circuitpython
    安装Thonnyhttps://thonny.org/在Thonny中安装circuitpython在配置解释器中选择circuitython然后点击右下角“安装或更新...“variant这里我选择了DOITesp32DevelopmentBoard(试过其他的一些个,不知道为什么安装完之后会无限重启,所以最后选择了这个)烧录完之后,重新连接,Th......
  • 利用Python进行金融数据分析的全面指南【文末送书】
    文章目录Python金融数据分析技术文章Python金融数据分析【文末送书】Python金融数据分析技术文章金融数据分析在现代金融行业中扮演着至关重要的角色。通过使用Python编程语言,我们可以对大量金融数据进行处理、分析和可视化,从而获得有价值的洞察。本篇文章将介绍如何......
  • python和sliver交互
    开源第三方库:https://sliverpy.readthedocs.io/en/latest/getting-started.html#connect-example代码示例:importosimportasynciofromsliverimportSliverClientConfig,SliverClientCONFIG_PATH=os.path.join('../sliver/','moloch_127.0.0.1.cfg')......
  • 不写代码,这样使用Python seaborn、matplotlib
    今天分享一个PyQt5GUI工具,动动鼠标拖拽就使用Python的Matplotlib、Seaborn进行绘图,并导出高清PDF。sviewgui安装pip install sviewguisviewgui使用使用很简单,因为,他只有一个方法啊:buildGUI();下面以tips.csv数据和boxplot为例介绍sviewgui的使用。以下三种方法均可......
  • 零基础学习人工智能—Python—Pytorch学习(一)
    前言其实学习人工智能不难,就跟学习软件开发一样,只是会的人相对少,而一些会的人写文章,做视频又不好好讲。比如,上来就跟你说要学习张量,或者告诉你张量是向量的多维度等等模式的讲解;目的都是让别人知道他会这个技术,但又不想让你学。对于学习,多年的学习经验,和无数次的回顾学习过程,都......
  • 【Python】网络编程
    计算机网络的介绍计算机的发展经历了以下几个阶段:阶段时间物理器件第一阶段1946年到20世纪50年代后期电子管第二阶段20世纪50年代后期到20世纪60年代中期晶体管第三阶段20世纪60年代中期到20世纪70年代初期中小规模集成电路第四阶段20世纪70年代初期至今大规模集成电路1.通......
  • 猫头虎分享 Python 知识点:pandas--info()函数用法
    ......