Rozwiązywanie równań symbolicznych z wykorzystaniem SageMath#

SageMath może być wykorzystany do analizowania równań funkcyjnych

Źródła:

Przykład 1#

Niech \(f:\mathbb{R}\rightarrow\mathbb{R}\) będzie funkcją oraz \(a\) parametrem różnym od \(-1,1\). Niech

\[af(x)+f(1/x)=ax.\]

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)
\(\displaystyle -a x + a f\left(x\right) + f\left(\frac{1}{x}\right) = 0\)
#Krok 1
expr2=expr1.subs(x=x^(-1))
pretty_print(expr2)
\(\displaystyle a f\left(\frac{1}{x}\right) - \frac{a}{x} + f\left(x\right) = 0\)
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)
\(\displaystyle f\left(x\right) = \frac{a x - f\left(\frac{1}{x}\right)}{a}\)
\(\displaystyle \verb|funkcja|\verb| |\verb|g:| x \ {\mapsto}\ a x - a f\left(x\right)\)
#Krok 2: podstawienie
pretty_print(expr2.substitution_delayed(f(1/x),g(x)))
expr3=expr2.substitution_delayed(f(1/x),g(x))
\(\displaystyle {\left(a x - a f\left(x\right)\right)} a - \frac{a}{x} + f\left(x\right) = 0\)
pretty_print(f(x)==solve(expr3,f(x))[0].rhs().simplify_full())
\(\displaystyle f\left(x\right) = \frac{a^{2} x^{2} - a}{{\left(a^{2} - 1\right)} x}\)

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ą

\[f(xf(x+y))-f(yf(x))-x^2=0\]

dla dowolnego \(x,y\in\mathbb{R}\).

Udowodnij, że

\[f(x)=\pm x\]

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)
\(\displaystyle -x^{2} = 0\)

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)
\(\displaystyle f\left(x f\left(x\right)\right) = x^{2}\)

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)
\(\displaystyle f\left(a f\left(b\right)\right) = a^{2} + f\left(-a f\left(a\right) + b f\left(a\right)\right)\)
expr5=expr4.substitution_delayed(a^2,expr3.lhs().subs(x=a))
expr5=expr5.factor()
pretty_print(expr5)
\(\displaystyle f\left(a f\left(b\right)\right) = f\left(-{\left(a - b\right)} f\left(a\right)\right) + f\left(a f\left(a\right)\right)\)
expr6=solve(expr5,f(-(a-b)*f(a)))[0]
pretty_print(expr6)
\(\displaystyle f\left(-{\left(a - b\right)} f\left(a\right)\right) = -f\left(a f\left(a\right)\right) + f\left(a f\left(b\right)\right)\)
#Niech f(a)=f(b)
expr7=expr6.substitution_delayed(f(b),f(a))
pretty_print(expr7)
\(\displaystyle f\left(-{\left(a - b\right)} f\left(a\right)\right) = 0\)

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)
\(\displaystyle \left(f\left(-x f\left(-x\right)\right) = x^{2}, f\left(x f\left(x\right)\right) = x^{2}\right)\)
\(\displaystyle f\left(-x f\left(-x\right)\right) = f\left(x f\left(x\right)\right)\)
#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)
\(\displaystyle -x f\left(-x\right) = x f\left(x\right)\)
expr10=expr9.subs(x=-x)
pretty_print(expr10)
\(\displaystyle x f\left(x\right) = -x f\left(-x\right)\)

Skoro \(f(0)=0\), więc zachodzi implikacja

\[x=0\implies f(-x)=-f(x)\]
#Dla x<>0 zachodzi
expr11=expr10.divide_both_sides(x)
pretty_print(expr11)
\(\displaystyle f\left(x\right) = -f\left(-x\right)\)

Krok 5: dowód bijektywności \(f(x)\)#

Z Kroku 2 wynika

pretty_print(expr3)
\(\displaystyle f\left(x f\left(x\right)\right) = x^{2}\)

zatem \(\mathbb{R}^{+}\cup\{0\}\subseteq f(\mathbb{R})\).

Skoro \(f(-x)=-f(x)\) na mocy Kroku 4, otrzymujemy

\[f(-xf(x))=-x^2,\]

więc

\[\mathbb{R}^{-}\subseteq f(\mathbb{R}).\]

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))
\(\displaystyle \left(\left[f\left(u\right) = 1\right], 1 = u^{2}\right)\)
#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)
\(\displaystyle f\left(f\left(x\right)\right) = f\left(x - 1\right) + 1\)
expr15=expr1.subs(x=1,y=-x-1).substitution_delayed(f(1),SR(1))
expr16=solve(expr15,f(f(-x)))[0]
pretty_print(expr16)
\(\displaystyle f\left(f\left(-x\right)\right) = f\left(-x - 1\right) + 1\)
#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)
\(\displaystyle f\left(f\left(x\right)\right) = f\left(x + 1\right) - 1\)
#Zatem
pretty_print((expr14,expr18))
\(\displaystyle \left(f\left(f\left(x\right)\right) = f\left(x - 1\right) + 1, f\left(f\left(x\right)\right) = f\left(x + 1\right) - 1\right)\)
#Ponadto
expr19=(expr18.rhs()==expr14.rhs()).add_to_both_sides(SR(1))
pretty_print(expr19)
\(\displaystyle f\left(x + 1\right) = f\left(x - 1\right) + 2\)
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)
\(\displaystyle f\left(x + 2\right) = f\left(x\right) + 2\)
\(\displaystyle f\left(x + 4\right) = f\left(x\right) + 4\)
#Wykonujemy następujące podstawienie
expr23=expr1.subs(x=2,y=x).add_to_both_sides(f(x*(f(2)))+4)
pretty_print(expr23)
\(\displaystyle f\left(2 \, f\left(x + 2\right)\right) = f\left(x f\left(2\right)\right) + 4\)

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)
\(\displaystyle f\left(2 \, f\left(x + 2\right)\right) = f\left(2 \, x + 4\right)\)
#Na mocy Kroku 3 f jest iniekcją
w0=SR.wild(0)
expr25=expr24.substitution_delayed(f(w0),w0)
pretty_print(expr25)
\(\displaystyle 2 \, f\left(x + 2\right) = 2 \, x + 4\)
#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)
\(\displaystyle f\left(x\right) = x\)
#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
\(\displaystyle f\left(f\left(x\right)\right) = -f\left(x + 1\right) - 1\)
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)
\(\displaystyle f\left(f\left(x\right)\right) = -f\left(x - 1\right) + 1\)
expr32=(expr28.rhs()==expr31.rhs()).multiply_both_sides(-1).add_to_both_sides(-1)
pretty_print(expr32)
\(\displaystyle f\left(x + 1\right) = f\left(x - 1\right) - 2\)
expr33=expr32.subs(x=x+1)
pretty_print(expr33)
\(\displaystyle f\left(x + 2\right) = f\left(x\right) - 2\)
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)
\(\displaystyle f\left(x - 4\right) = f\left(x\right) + 4\)
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)
\(\displaystyle f\left(2 \, f\left(x + 2\right)\right) = f\left(-2 \, x\right) + 4\)
expr38=expr37.substitution_delayed(expr35.rhs().subs(x=-2*x),expr35.lhs().subs(x=-2*x))
pretty_print(expr38)
\(\displaystyle f\left(2 \, f\left(x + 2\right)\right) = f\left(-2 \, x - 4\right)\)
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)
\(\displaystyle f\left(x\right) = -x\)

Weryfikacja#

g1(x)=-x
bool(expr1.substitute_function(f,g1).expand())
True
g2(x)=x
bool(expr1.substitute_function(f,g2).expand())
True