Rozwiązywanie równań symbolicznych z wykorzystaniem SageMath#
SageMath może być wykorzystany do analizowania równań funkcyjnych
Źródła:
https://artofproblemsolving.com/wiki/index.php/Functional_equation
https://imomath.com/index.cgi?page=functionalEquationsProblemsWithSolutions
https://www.isinj.com/mt-usamo/100 Functional Equations Problems.pdf
Przykład 1#
Niech \(f:\mathbb{R}\rightarrow\mathbb{R}\) będzie funkcją oraz \(a\) parametrem różnym od \(-1,1\). Niech
Znajdź postać jawną funkcji \(f(x)\).
x=var('x')
a=var('a')
assume(a != 1 , a != -1)
f=function('f')
expr1=a*f(x)+f(1/x)-a*x==0
pretty_print(expr1)
#Krok 1
expr2=expr1.subs(x=x^(-1))
pretty_print(expr2)
pretty_print(solve(expr1,f(x))[0]) #z expr1
g=function('g')
g(x)=solve(expr1,f(1/x))[0].rhs()
pretty_print("funkcja g:",g)
#Krok 2: podstawienie
pretty_print(expr2.substitution_delayed(f(1/x),g(x)))
expr3=expr2.substitution_delayed(f(1/x),g(x))
pretty_print(f(x)==solve(expr3,f(x))[0].rhs().simplify_full())
Weryfikacja#
h(x)=solve(expr3,f(x))[0].rhs()
bool(expr1.substitute_function(f,h).lhs().simplify_full()==0)
True
Przykład 2#
Niech \(f:\mathbb{R}\rightarrow\mathbb{R}\) będzie funkcją
dla dowolnego \(x,y\in\mathbb{R}\).
Udowodnij, że
dla \(x\in\mathbb{R}\).
f=function('f')
x,y=var('x,y')
expr1=f(x*f(x+y))-f(y*f(x))-x^2==0 #f jest funkcją zmiennej x
#rozwiązanie pochodzi ze strony: https://artofproblemsolving.com/community/c6h346514
Krok 1: udowadniamy \(f(x) = 0 \leftrightarrow x=0\).#
expr1.subs(x=0,y=x/f(0)) #założenie, że f(0)!=0 prowadzi do
f(0) - f(x) == 0
c=var('c')
g(x)=c
expr1.substitute_function(f,g) #sprzeczność, skoro x jest zmienne
-x^2 == 0
Zachodzi równość \(f(0)=0\). Udowodnimy teraz, że gdy \(f(x)=0\), to \(x=0\).
expr2=expr1.subs(y=0).substitution_delayed(f(0),0*x).substitution_delayed(f(x),0*x).substitution_delayed(f(0),0*x)
pretty_print(expr2)
Krok 2: Udowodnij \(f(xf(x))=x^2\)#
expr3=expr1.subs(y=0).substitution_delayed(f(0),0*x).add_to_both_sides(x^2)
pretty_print(expr3)
Krok 3: Udowodnij, że \(f\) jest iniekcją#
a,b=var('a,b')
expr4=solve(expr1.subs(x=a,y=b-a),f(a*f(b)))[0]
pretty_print(expr4)
expr5=expr4.substitution_delayed(a^2,expr3.lhs().subs(x=a))
expr5=expr5.factor()
pretty_print(expr5)
expr6=solve(expr5,f(-(a-b)*f(a)))[0]
pretty_print(expr6)
#Niech f(a)=f(b)
expr7=expr6.substitution_delayed(f(b),f(a))
pretty_print(expr7)
Zatem \((a-b)f(a)=0\) z Kroku 1.
Zachodzi zatem:
\(f(a)=f(b)=0\) i \(a=b=0\) na mocy Krok 1 lub
\(a-b=0\).
Ta alternatywa dowodzi, że funkcja \(f\) jest iniekcją.
Krok 4: dowód równości \(f(-x)=-f(x)\)#
pretty_print((expr3.subs(x=-x), expr3))
#zatem
expr8=(expr3.subs(x=-x).lhs()== expr3.lhs())
pretty_print(expr8)
#Skoro f jest iniekcją na mocy Kroku 3, zachodzi
w0=SR.wild(0) #używamy wildcards do zastąpienia części wzorca
expr9=expr8.substitution_delayed(f(w0),w0)
pretty_print(expr9)
expr10=expr9.subs(x=-x)
pretty_print(expr10)
Skoro \(f(0)=0\), więc zachodzi implikacja
#Dla x<>0 zachodzi
expr11=expr10.divide_both_sides(x)
pretty_print(expr11)
Krok 5: dowód bijektywności \(f(x)\)#
Z Kroku 2 wynika
pretty_print(expr3)
zatem \(\mathbb{R}^{+}\cup\{0\}\subseteq f(\mathbb{R})\).
Skoro \(f(-x)=-f(x)\) na mocy Kroku 4, otrzymujemy
więc
Czyli \(f\) jest suriekcją, oraz bijekcją na mocy Kroku 3.
Krok 6#
Dowód alternatywy: \(f(x)=x\) lub \(f(x)=-x\).#
Niech \(u\) spełnia \(f(u)=1\). Takie \(u\) na mocy surjektywności \(f\) w Kroku 5.
u=var('u')
assume(f(u)==1)
expr12=expr3.subs(x=u).substitution_delayed(f(u),SR(1)) #SR to Symbolic Ring
pretty_print((assumptions(u),expr12))
#Przypadek 1: u=1
expr13=expr1.subs(x=1,y=x-1).substitution_delayed(f(1),SR(1))
expr14=solve(expr13,f(f(x)))[0]
pretty_print(expr14)
expr15=expr1.subs(x=1,y=-x-1).substitution_delayed(f(1),SR(1))
expr16=solve(expr15,f(f(-x)))[0]
pretty_print(expr16)
#Zatem
def Simp1(expr):
k=var('k') #dodatkowa zmienna
return expr.substitution_delayed(f(-w0),lambda k: -f(x))
def Simp2(expr):
k=var('k') #dodatkowa zmienna
return expr.substitution_delayed(f(-f(w0)),lambda k: -f(f(x)))
def Simp3(expr):
k=var('k') #dodatkowa zmienna
return expr.substitution_delayed(f(-x-1),-f(x+1))
expr17=Simp3(Simp2(Simp1(expr16)))
expr18=solve(expr17,f(f(x)))[0]
pretty_print(expr18)
#Zatem
pretty_print((expr14,expr18))
#Ponadto
expr19=(expr18.rhs()==expr14.rhs()).add_to_both_sides(SR(1))
pretty_print(expr19)
expr20=expr19.subs(x=x+1)
pretty_print(expr20)
expr21=expr20.subs(x=x+2)
expr22=expr21.substitution_delayed(f(x+2),expr20.rhs())
pretty_print(expr22)
#Wykonujemy następujące podstawienie
expr23=expr1.subs(x=2,y=x).add_to_both_sides(f(x*(f(2)))+4)
pretty_print(expr23)
Skoro \(f(0)=0\) oraz \(f(x+2)=f(x)+2\), więc \(f(2)=2\)
w0=SR.wild(0)
expr24=expr23.substitution_delayed(f(2),SR(2)).substitution_delayed(f(2*x)+4,f(2*x+4))
pretty_print(expr24)
#Na mocy Kroku 3 f jest iniekcją
w0=SR.wild(0)
expr25=expr24.substitution_delayed(f(w0),w0)
pretty_print(expr25)
#Formuła 21 implikuje
expr26=expr25.substitution_delayed(f(x+2),f(x)+\
2).add_to_both_sides(-4).divide_both_sides(2)
pretty_print(expr26)
#Przypadek 2: u=-1, więc f(-1)=1
expr27=expr1.subs(x=-1,y=x+1).substitution_delayed(f(-1),SR(1)).substitution_delayed(f(-f(x)),-f(f(x)))
expr28=solve(expr27,f(f(x)))[0]
pretty_print(expr28) #w oryginalnym opisie w tym miejscu znajduje się błędny znak
expr29=expr1.subs(x=-1,y=-x+1).substitution_delayed(f(-1),SR(1)).substitution_delayed(f(-x),-f(x))
expr30=solve(expr29,f(f(x)))[0]
expr31=expr30.substitution_delayed(f(-x+1),-f(x-1))
pretty_print(expr31)
expr32=(expr28.rhs()==expr31.rhs()).multiply_both_sides(-1).add_to_both_sides(-1)
pretty_print(expr32)
expr33=expr32.subs(x=x+1)
pretty_print(expr33)
expr34=expr33.subs(x=x+1).substitution_delayed(f(x+1),expr32.rhs()).subs(x=x+1).subs(x=-x)
expr35=expr34.substitution_delayed(f(-x+4),-f(x-4)).substitution_delayed(f(-x),-f(x)).multiply_both_sides(-1)
pretty_print(expr35)
expr36=expr1.subs(x=2,y=x).substitution_delayed(f(2),-SR(2)) #z expr33 i Kroku 1
expr37=solve(expr36,f(2*f(x+2)))[0]
pretty_print(expr37)
expr38=expr37.substitution_delayed(expr35.rhs().subs(x=-2*x),expr35.lhs().subs(x=-2*x))
pretty_print(expr38)
w0=SR.wild(0)
expr39=solve(expr38.substitution_delayed(f(w0),w0),f(x+2))[0]
expr40=expr39.subs(x=x-2)
pretty_print(expr40)
Weryfikacja#
g1(x)=-x
bool(expr1.substitute_function(f,g1).expand())
True
g2(x)=x
bool(expr1.substitute_function(f,g2).expand())
True