You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python的柯西主值积分求解问题

处理带奇点函数的柯西主值积分问题

首先分析你的积分函数:
$$f(x) = -\frac{x \sin2x}{x \cos x + \sin x}$$

奇点分析

  • x=0:分母为0,但分子也为0,用洛必达法则可证此处是可去奇点,函数极限为0,数值计算时可直接处理避免报错。
  • x≈2.0287665755744362:这是方程$\tan x = -x$的正根,此处分母为0、分子非0,是一阶极点,需要计算柯西主值。

问题出在哪

你当前的代码把区间端点也放进了points参数,这会干扰quad的积分拆分逻辑;另外,没有针对性地处理柯西主值的计算方式,导致收敛慢触发警告。

修正后的代码方案

方案1:拆分积分区间(手动处理奇点)

只把真正的奇点放进points,同时处理x=0的可去奇点:

from scipy.integrate import quad
import numpy as np

def integrand(x):
    # 处理x=0处的可去奇点,避免0/0的数值问题
    if x == 0:
        return 0.0
    return -(x * np.sin(2*x)) / (x * np.cos(x) + np.sin(x))

def cauchy_principal_value(f, a, b, singular_point):
    # 仅将奇点加入points,拆分积分区间为[a, singular_point]和[singular_point, b]
    integral, error = quad(f, a, b, points=[singular_point], limit=1000)
    return integral, error

# 奇点位置:tanx=-x的正根
singular_point = 2.0287665755744362
result, err = cauchy_principal_value(integrand, 0, np.pi, singular_point)

print("柯西主值:", result)
print("积分误差:", err)

方案2:使用quad的柯西主值权重(更直接)

quad支持weight='cauchy'参数,专门用于计算柯西主值,此时wvar指定奇点位置:

from scipy.integrate import quad
import numpy as np

def integrand(x):
    if x == 0:
        return 0.0
    return -(x * np.sin(2*x)) / (x * np.cos(x) + np.sin(x))

# 直接用weight参数计算柯西主值
singular_point = 2.0287665755744362
result, err = quad(integrand, 0, np.pi, weight='cauchy', wvar=singular_point, limit=1000)

print("柯西主值:", result)
print("积分误差:", err)

关键说明

  • 处理可去奇点:x=0处直接返回极限值0,避免数值计算中出现0/0的NaN或不稳定。
  • 避免冗余points:仅将真正的极点加入points,端点不是奇点的话无需添加。
  • 柯西主值权重:weight='cauchy'是scipy专门为这种一阶极点主值积分设计的参数,收敛性更好,能有效减少警告。

内容的提问来源于stack exchange,提问作者Frederik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:54:59