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

如何用Python计算点到三次曲线的垂足交点坐标

实现步骤与代码

数学逻辑梳理

首先明确核心关系:过点A(x₁,y₁)的直线若与曲线在点B(x,y)处的切线垂直(即该直线是曲线在B点的法线),则满足两个条件:

  1. B点在曲线上:y = a·x³ + b·x² + cˣ
  2. 法线斜率等于两点连线斜率:(y - y₁)/(x - x₁) = -1/f’(x),其中f’(x)是曲线在B点的导数(f’(x) = 3a·x² + 2b·x + ln(c)·cˣ)

将条件1代入条件2,整理得到需要求解的非线性方程:

(f(x) - y₁)·f’(x) + (x - x₁) = 0

这类方程无解析解,需用数值方法求解。

Python 实现代码

我们用scipy.optimize.fsolve来求解非线性方程,以下是完整示例:

import numpy as np
from scipy.optimize import fsolve

# 定义曲线函数
def curve(x, a, b, c):
    return a * x**3 + b * x**2 + c**x

# 定义曲线的导数函数(用于计算切线斜率)
def curve_derivative(x, a, b, c):
    return 3*a*x**2 + 2*b*x + np.log(c) * (c**x)

# 构造需要求解的方程:等式整理为等于0的形式
def solve_equation(x, x1, y1, a, b, c):
    return (curve(x, a, b, c) - y1) * curve_derivative(x, a, b, c) + (x - x1)

# ---------------------- 示例参数 ----------------------
# 曲线参数
a = 1
b = 0
c = 2
# 点A的坐标(假设A在曲线上,若不在则直接传入y1即可)
x1 = 0
y1 = curve(x1, a, b, c)
# ---------------------- 求解过程 ----------------------
# 初始猜测值:需根据曲线形状选择,避免收敛到点A本身
initial_guess = 1.0
# 求解方程
x_b = fsolve(solve_equation, initial_guess, args=(x1, y1, a, b, c))[0]
y_b = curve(x_b, a, b, c)

print(f"交点B的坐标:({x_b:.4f}, {y_b:.4f})")

注意事项

  • 若你的曲线是标准三次多项式(即y = ax³ + bx² + cx + d,而非含指数项),只需修改curve和curve_derivative函数:
    def curve(x, a, b, c, d):
        return a * x**3 + b * x**2 + c * x + d
    
    def curve_derivative(x, a, b, c, d):
        return 3*a*x**2 + 2*b*x + c
    
    同时调整solve_equation的参数即可。
  • 初始猜测值的选择很关键:如果猜测值太靠近x₁,可能收敛到点A本身,建议先绘制曲线观察大致位置,再选择合适的初始值。
  • 指数项cˣ要求c > 0且c ≠ 1,否则导数计算会出错。

内容的提问来源于stack exchange,提问作者xc-2021

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:15:33