Касательная линия между двумя функциями - PullRequest
0 голосов
/ 17 мая 2018

Учитывая две функции, я хочу найти касательную линию (и) между ними.Формула / система для этого, если даны две произвольные функции 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, но там написано: «Невозможно вычислить 1-ю производную по 0,6».Я не знаю, как заставить его ввести начальные значения для решения системы после взятия производной по x и y соответственно.Как бы я получил решение для этих значений при возможности изменить n, чтобы касательная линия также могла быть найдена между первой производной и второй производной и так далее?Вот картинка, показывающая, как это выглядит. Tangent Line Between Functions

1 Ответ

0 голосов
/ 05 июня 2018

Я разобрался, как решить эту проблему.Вот решение ниже.

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]   
...