我试图用python找到两条曲线的公切线,但我无法解决它。
这两条曲线的方程很复杂,涉及对数。
在python中有没有一种方法来计算切线的x坐标,该切线通常是两条曲线的公共切线。(x)和g(x)、我想找到x1和x2在一条公切线上的x坐标,其中x1位于f上我尝试f '(x1)= g'(x2)和f '(x1)= f(x1)- f(x2)/(x1- x2)来得到x1和x2,但是由于方程太复杂,我无法使用非线性求解来得到值。
我只想求出公切线的x坐标
有谁能提出一个更好的方法吗?
import numpy as np
import sympy
from sympy import *
from matplotlib import pyplot as plt
x = symbols('x')
a, b, c, d, e, f = -99322.50019502985, -86864.87072433547, -96876.05627516498, -89703.35055202093, -3390.863799999999, -20942.518
def func(x):
y1_1 = a - a*x + b*x
y1_2 = c - c*x + d*x
c1 = (1 - x)**(1 - x)
c2 = (x**x)
y2 = 12471 * (sympy.log((c1*c2)))
y3 = 2*f*x**3 - x**2*(e + 3*f) + x*(e + f)
eqn1 = y1_1 + y2 + y3
eqn2 = y1_2 + y2 + y3
return eqn1, eqn2
val = np.linspace(0, 1)
f1 = sympy.lambdify(x, func(x)[0])(val)
f2 = sympy.lambdify(x, func(x)[1])(val)
plt.plot(val, f1)
plt.plot(val, f2)
plt.show()
我在试这个
x1, x2 = sympy.symbols('x1 x2')
fun1 = func(x1)[0]
fun2 = func(x2)[0]
diff1 = diff(fun1,x1)
diff2 = diff(fun2,x2)
eq1 = diff1 - diff2
eq2 = diff1 - ((fun1 - fun2) / (x1 - x2))
sol = nonlinsolve([eq1, eq2], [x1, x2])
2条答案
按热度按时间a7qyws3x1#
首先需要做的是简化公式
例如,第一个公式实际上是:
这是一个更清晰的二次项,带有对数项。我希望你也可以在对数项上做一些工作,但这是原帖的节选。
同样,第二个公式也可以用同样的方法简化,这也是原始发布者的摘录。
由此,两个方程都需要对x求导以求出正切,然后使两个公式相等(对于公切线)。
这就彻底解决了问题。
我真的想知道这是一个Python的问题,还是一个纯粹的数学问题。
of1yzvn42#
需要注意的是,由于导数是单调的,对于
fun1
的任何导数值,fun2
都有一个解,如果绘制两个导数,这一点很容易看出。因此,我们需要一个函数,给定一个
x1
,返回与之匹配的x2
。我将使用数值解法,因为系统对于数值解法来说太麻烦了。我用
fmin
作为上面的解算器,因为它很好用,而且我知道如何使用它。也许root_scalar
能给予更好的结果。使用上面的函数,我们得到一些导数相等的对
(x1, x2)
:这个结果就是:
如果您需要几个
x1
的x2
(请注意,在某些情况下,求解器会遇到日志无效的值。请始终检查结果的有效性):