两个函数之间的切线
Tangent Line Between Two Functions
给定两个函数,我想找到它们之间的切线。 formula/system 如果给定两个任意函数 f(x) 和 g(x),则为:
f(x)-x*f'(x)-g(y)+y*g'(y)=0
f'(x)-g'(y)=0
当求解时,假设 x=a 和 y=b,给出两个点:(a,f(a)) 和 (b,g(b)),这样可以在它们之间画一条线。
我想找到它们之间的切线的函数是 x^-x 及其一阶导数 (x^-x(-ln(x)-1))。
我的代码是:
import sympy as sp
import numpy as np
import scipy.optimize as opt
n=1
s1,s2=sp.symbols('s1 s2')
def f1(z1):
return z1**-z1
def myFunction(z):
x=z[0]
y=z[1]
q1=f1(s1)-s1*sp.diff(f1(s1),s1,n)-
sp.diff(f1(s2),s2,n)+s2*sp.diff(f1(s2),s2,n+1)
q2=sp.diff(f1(s1),s1,n)-sp.diff(f1(s2),s2,n+1)
F=np.empty((2))
F[0]=abs(q1.subs([(s1,x),(s2,y)]))
F[1]=abs(q2.subs([(s1,x),(s2,y)]))
return F
zGuess=np.array([0.6,1.3])
z=opt.fsolve(myFunction, zGuess)
print(z)
解决方案应该是 x=0.59515 和 y=1.37866,但它显示 "Can't calculate 1st derivative wrt 0.6"。我不知道如何让它在分别对 x 和 y 求导后输入求解系统的初始值。我将如何在能够更改 n 的同时解决这些值,以便在一阶导数和二阶导数之间也可以找到切线等等?这是一张展示它的样子的图片。
我想出了解决这个问题的方法。下面是解决方案。
import sympy as sp
import numpy as np
import scipy.optimize as opt
s1,s2=sp.symbols('s1 s2')
def f1(z1):
return z1**-z1
def myFunction(z,n):
x=z[0]
y=z[1]
if n % 2 ==0:
w1=1
w2=-1
else:
w1=-1
w2=1
q1=w2*sp.diff(f1(s1),s1,n-1)-w2*s1*sp.diff(f1(s1),s1,n)-
w1*sp.diff(f1(s2),s2,n)+w1*s2*sp.diff(f1(s2),s2,n+1)
q2=w2*sp.diff(f1(s1),s1,n)-w1*sp.diff(f1(s2),s2,n+1)
F=np.empty((2))
F[0]=abs(q1.subs([(s1,x),(s2,y)]))
F[1]=abs(q2.subs([(s1,x),(s2,y)]))
return F
j1=1
j2=10
z=np.empty((j2+1,2))
for i in range(j1,j2+1):
n=i
a=float(0.5211*n+0.184)
b=float(0.916745*a+0.794333)
zGuess=np.array([a,b])
z[i,:]=opt.fsolve(myFunction, zGuess, n, maxfev = 6000)
print(z[i,:])
这个解决方案给出了前十对点。完成后的输出是
[ 0.59515445 1.37866112]
[ 1.19255583 1.87697191]
[ 1.75662656 2.37914507]
[ 2.29484826 2.87469058]
[ 2.81278951 3.36119549]
[ 3.31426591 3.83840029]
[ 3.80198665 4.30671276]
[ 4.277955 4.76673553]
[ 4.74370426 5.21909897]
[ 5.20044161 5.66440097]
给定两个函数,我想找到它们之间的切线。 formula/system 如果给定两个任意函数 f(x) 和 g(x),则为:
f(x)-x*f'(x)-g(y)+y*g'(y)=0
f'(x)-g'(y)=0
当求解时,假设 x=a 和 y=b,给出两个点:(a,f(a)) 和 (b,g(b)),这样可以在它们之间画一条线。 我想找到它们之间的切线的函数是 x^-x 及其一阶导数 (x^-x(-ln(x)-1))。 我的代码是:
import sympy as sp
import numpy as np
import scipy.optimize as opt
n=1
s1,s2=sp.symbols('s1 s2')
def f1(z1):
return z1**-z1
def myFunction(z):
x=z[0]
y=z[1]
q1=f1(s1)-s1*sp.diff(f1(s1),s1,n)-
sp.diff(f1(s2),s2,n)+s2*sp.diff(f1(s2),s2,n+1)
q2=sp.diff(f1(s1),s1,n)-sp.diff(f1(s2),s2,n+1)
F=np.empty((2))
F[0]=abs(q1.subs([(s1,x),(s2,y)]))
F[1]=abs(q2.subs([(s1,x),(s2,y)]))
return F
zGuess=np.array([0.6,1.3])
z=opt.fsolve(myFunction, zGuess)
print(z)
解决方案应该是 x=0.59515 和 y=1.37866,但它显示 "Can't calculate 1st derivative wrt 0.6"。我不知道如何让它在分别对 x 和 y 求导后输入求解系统的初始值。我将如何在能够更改 n 的同时解决这些值,以便在一阶导数和二阶导数之间也可以找到切线等等?这是一张展示它的样子的图片。
我想出了解决这个问题的方法。下面是解决方案。
import sympy as sp
import numpy as np
import scipy.optimize as opt
s1,s2=sp.symbols('s1 s2')
def f1(z1):
return z1**-z1
def myFunction(z,n):
x=z[0]
y=z[1]
if n % 2 ==0:
w1=1
w2=-1
else:
w1=-1
w2=1
q1=w2*sp.diff(f1(s1),s1,n-1)-w2*s1*sp.diff(f1(s1),s1,n)-
w1*sp.diff(f1(s2),s2,n)+w1*s2*sp.diff(f1(s2),s2,n+1)
q2=w2*sp.diff(f1(s1),s1,n)-w1*sp.diff(f1(s2),s2,n+1)
F=np.empty((2))
F[0]=abs(q1.subs([(s1,x),(s2,y)]))
F[1]=abs(q2.subs([(s1,x),(s2,y)]))
return F
j1=1
j2=10
z=np.empty((j2+1,2))
for i in range(j1,j2+1):
n=i
a=float(0.5211*n+0.184)
b=float(0.916745*a+0.794333)
zGuess=np.array([a,b])
z[i,:]=opt.fsolve(myFunction, zGuess, n, maxfev = 6000)
print(z[i,:])
这个解决方案给出了前十对点。完成后的输出是
[ 0.59515445 1.37866112]
[ 1.19255583 1.87697191]
[ 1.75662656 2.37914507]
[ 2.29484826 2.87469058]
[ 2.81278951 3.36119549]
[ 3.31426591 3.83840029]
[ 3.80198665 4.30671276]
[ 4.277955 4.76673553]
[ 4.74370426 5.21909897]
[ 5.20044161 5.66440097]