12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897 |
- #
- # The main tests for the code in single.py are currently located in
- # sympy/solvers/tests/test_ode.py
- #
- r"""
- This File contains test functions for the individual hints used for solving ODEs.
- Examples of each solver will be returned by _get_examples_ode_sol_name_of_solver.
- Examples should have a key 'XFAIL' which stores the list of hints if they are
- expected to fail for that hint.
- Functions that are for internal use:
- 1) _ode_solver_test(ode_examples) - It takes a dictionary of examples returned by
- _get_examples method and tests them with their respective hints.
- 2) _test_particular_example(our_hint, example_name) - It tests the ODE example corresponding
- to the hint provided.
- 3) _test_all_hints(runxfail=False) - It is used to test all the examples with all the hints
- currently implemented. It calls _test_all_examples_for_one_hint() which outputs whether the
- given hint functions properly if it classifies the ODE example.
- If runxfail flag is set to True then it will only test the examples which are expected to fail.
- Everytime the ODE of a particular solver is added, _test_all_hints() is to be executed to find
- the possible failures of different solver hints.
- 4) _test_all_examples_for_one_hint(our_hint, all_examples) - It takes hint as argument and checks
- this hint against all the ODE examples and gives output as the number of ODEs matched, number
- of ODEs which were solved correctly, list of ODEs which gives incorrect solution and list of
- ODEs which raises exception.
- """
- from sympy.core.function import (Derivative, diff)
- from sympy.core.mul import Mul
- from sympy.core.numbers import (E, I, Rational, pi)
- from sympy.core.relational import (Eq, Ne)
- from sympy.core.singleton import S
- from sympy.core.symbol import (Dummy, symbols)
- from sympy.functions.elementary.complexes import (im, re)
- from sympy.functions.elementary.exponential import (LambertW, exp, log)
- from sympy.functions.elementary.hyperbolic import (asinh, cosh, sinh, tanh)
- from sympy.functions.elementary.miscellaneous import (cbrt, sqrt)
- from sympy.functions.elementary.piecewise import Piecewise
- from sympy.functions.elementary.trigonometric import (acos, asin, atan, cos, sec, sin, tan)
- from sympy.functions.special.error_functions import (Ei, erfi)
- from sympy.functions.special.hyper import hyper
- from sympy.integrals.integrals import (Integral, integrate)
- from sympy.polys.rootoftools import rootof
- from sympy.core import Function, Symbol
- from sympy.functions import airyai, airybi, besselj, bessely, lowergamma
- from sympy.integrals.risch import NonElementaryIntegral
- from sympy.solvers.ode import classify_ode, dsolve
- from sympy.solvers.ode.ode import allhints, _remove_redundant_solutions
- from sympy.solvers.ode.single import (FirstLinear, ODEMatchError,
- SingleODEProblem, SingleODESolver, NthOrderReducible)
- from sympy.solvers.ode.subscheck import checkodesol
- from sympy.testing.pytest import raises, slow, ON_CI
- import traceback
- x = Symbol('x')
- u = Symbol('u')
- _u = Dummy('u')
- y = Symbol('y')
- f = Function('f')
- g = Function('g')
- C1, C2, C3, C4, C5, C6, C7, C8, C9, C10 = symbols('C1:11')
- hint_message = """\
- Hint did not match the example {example}.
- The ODE is:
- {eq}.
- The expected hint was
- {our_hint}\
- """
- expected_sol_message = """\
- Different solution found from dsolve for example {example}.
- The ODE is:
- {eq}
- The expected solution was
- {sol}
- What dsolve returned is:
- {dsolve_sol}\
- """
- checkodesol_msg = """\
- solution found is not correct for example {example}.
- The ODE is:
- {eq}\
- """
- dsol_incorrect_msg = """\
- solution returned by dsolve is incorrect when using {hint}.
- The ODE is:
- {eq}
- The expected solution was
- {sol}
- what dsolve returned is:
- {dsolve_sol}
- You can test this with:
- eq = {eq}
- sol = dsolve(eq, hint='{hint}')
- print(sol)
- print(checkodesol(eq, sol))
- """
- exception_msg = """\
- dsolve raised exception : {e}
- when using {hint} for the example {example}
- You can test this with:
- from sympy.solvers.ode.tests.test_single import _test_an_example
- _test_an_example('{hint}', example_name = '{example}')
- The ODE is:
- {eq}
- \
- """
- check_hint_msg = """\
- Tested hint was : {hint}
- Total of {matched} examples matched with this hint.
- Out of which {solve} gave correct results.
- Examples which gave incorrect results are {unsolve}.
- Examples which raised exceptions are {exceptions}
- \
- """
- def _add_example_keys(func):
- def inner():
- solver=func()
- examples=[]
- for example in solver['examples']:
- temp={
- 'eq': solver['examples'][example]['eq'],
- 'sol': solver['examples'][example]['sol'],
- 'XFAIL': solver['examples'][example].get('XFAIL', []),
- 'func': solver['examples'][example].get('func',solver['func']),
- 'example_name': example,
- 'slow': solver['examples'][example].get('slow', False),
- 'simplify_flag':solver['examples'][example].get('simplify_flag',True),
- 'checkodesol_XFAIL': solver['examples'][example].get('checkodesol_XFAIL', False),
- 'dsolve_too_slow':solver['examples'][example].get('dsolve_too_slow',False),
- 'checkodesol_too_slow':solver['examples'][example].get('checkodesol_too_slow',False),
- 'hint': solver['hint']
- }
- examples.append(temp)
- return examples
- return inner()
- def _ode_solver_test(ode_examples, run_slow_test=False):
- for example in ode_examples:
- if ((not run_slow_test) and example['slow']) or (run_slow_test and (not example['slow'])):
- continue
- result = _test_particular_example(example['hint'], example, solver_flag=True)
- if result['xpass_msg'] != "":
- print(result['xpass_msg'])
- def _test_all_hints(runxfail=False):
- all_hints = list(allhints)+["default"]
- all_examples = _get_all_examples()
- for our_hint in all_hints:
- if our_hint.endswith('_Integral') or 'series' in our_hint:
- continue
- _test_all_examples_for_one_hint(our_hint, all_examples, runxfail)
- def _test_dummy_sol(expected_sol,dsolve_sol):
- if type(dsolve_sol)==list:
- return any(expected_sol.dummy_eq(sub_dsol) for sub_dsol in dsolve_sol)
- else:
- return expected_sol.dummy_eq(dsolve_sol)
- def _test_an_example(our_hint, example_name):
- all_examples = _get_all_examples()
- for example in all_examples:
- if example['example_name'] == example_name:
- _test_particular_example(our_hint, example)
- def _test_particular_example(our_hint, ode_example, solver_flag=False):
- eq = ode_example['eq']
- expected_sol = ode_example['sol']
- example = ode_example['example_name']
- xfail = our_hint in ode_example['XFAIL']
- func = ode_example['func']
- result = {'msg': '', 'xpass_msg': ''}
- simplify_flag=ode_example['simplify_flag']
- checkodesol_XFAIL = ode_example['checkodesol_XFAIL']
- dsolve_too_slow = ode_example['dsolve_too_slow']
- checkodesol_too_slow = ode_example['checkodesol_too_slow']
- xpass = True
- if solver_flag:
- if our_hint not in classify_ode(eq, func):
- message = hint_message.format(example=example, eq=eq, our_hint=our_hint)
- raise AssertionError(message)
- if our_hint in classify_ode(eq, func):
- result['match_list'] = example
- try:
- if not (dsolve_too_slow):
- dsolve_sol = dsolve(eq, func, simplify=simplify_flag,hint=our_hint)
- else:
- if len(expected_sol)==1:
- dsolve_sol = expected_sol[0]
- else:
- dsolve_sol = expected_sol
- except Exception as e:
- dsolve_sol = []
- result['exception_list'] = example
- if not solver_flag:
- traceback.print_exc()
- result['msg'] = exception_msg.format(e=str(e), hint=our_hint, example=example, eq=eq)
- if solver_flag and not xfail:
- print(result['msg'])
- raise
- xpass = False
- if solver_flag and dsolve_sol!=[]:
- expect_sol_check = False
- if type(dsolve_sol)==list:
- for sub_sol in expected_sol:
- if sub_sol.has(Dummy):
- expect_sol_check = not _test_dummy_sol(sub_sol, dsolve_sol)
- else:
- expect_sol_check = sub_sol not in dsolve_sol
- if expect_sol_check:
- break
- else:
- expect_sol_check = dsolve_sol not in expected_sol
- for sub_sol in expected_sol:
- if sub_sol.has(Dummy):
- expect_sol_check = not _test_dummy_sol(sub_sol, dsolve_sol)
- if expect_sol_check:
- message = expected_sol_message.format(example=example, eq=eq, sol=expected_sol, dsolve_sol=dsolve_sol)
- raise AssertionError(message)
- expected_checkodesol = [(True, 0) for i in range(len(expected_sol))]
- if len(expected_sol) == 1:
- expected_checkodesol = (True, 0)
- if not (checkodesol_too_slow and ON_CI):
- if not checkodesol_XFAIL:
- if checkodesol(eq, dsolve_sol, func, solve_for_func=False) != expected_checkodesol:
- result['unsolve_list'] = example
- xpass = False
- message = dsol_incorrect_msg.format(hint=our_hint, eq=eq, sol=expected_sol,dsolve_sol=dsolve_sol)
- if solver_flag:
- message = checkodesol_msg.format(example=example, eq=eq)
- raise AssertionError(message)
- else:
- result['msg'] = 'AssertionError: ' + message
- if xpass and xfail:
- result['xpass_msg'] = example + "is now passing for the hint" + our_hint
- return result
- def _test_all_examples_for_one_hint(our_hint, all_examples=[], runxfail=None):
- if all_examples == []:
- all_examples = _get_all_examples()
- match_list, unsolve_list, exception_list = [], [], []
- for ode_example in all_examples:
- xfail = our_hint in ode_example['XFAIL']
- if runxfail and not xfail:
- continue
- if xfail:
- continue
- result = _test_particular_example(our_hint, ode_example)
- match_list += result.get('match_list',[])
- unsolve_list += result.get('unsolve_list',[])
- exception_list += result.get('exception_list',[])
- if runxfail is not None:
- msg = result['msg']
- if msg!='':
- print(result['msg'])
- # print(result.get('xpass_msg',''))
- if runxfail is None:
- match_count = len(match_list)
- solved = len(match_list)-len(unsolve_list)-len(exception_list)
- msg = check_hint_msg.format(hint=our_hint, matched=match_count, solve=solved, unsolve=unsolve_list, exceptions=exception_list)
- print(msg)
- def test_SingleODESolver():
- # Test that not implemented methods give NotImplementedError
- # Subclasses should override these methods.
- problem = SingleODEProblem(f(x).diff(x), f(x), x)
- solver = SingleODESolver(problem)
- raises(NotImplementedError, lambda: solver.matches())
- raises(NotImplementedError, lambda: solver.get_general_solution())
- raises(NotImplementedError, lambda: solver._matches())
- raises(NotImplementedError, lambda: solver._get_general_solution())
- # This ODE can not be solved by the FirstLinear solver. Here we test that
- # it does not match and the asking for a general solution gives
- # ODEMatchError
- problem = SingleODEProblem(f(x).diff(x) + f(x)*f(x), f(x), x)
- solver = FirstLinear(problem)
- raises(ODEMatchError, lambda: solver.get_general_solution())
- solver = FirstLinear(problem)
- assert solver.matches() is False
- #These are just test for order of ODE
- problem = SingleODEProblem(f(x).diff(x) + f(x), f(x), x)
- assert problem.order == 1
- problem = SingleODEProblem(f(x).diff(x,4) + f(x).diff(x,2) - f(x).diff(x,3), f(x), x)
- assert problem.order == 4
- problem = SingleODEProblem(f(x).diff(x, 3) + f(x).diff(x, 2) - f(x)**2, f(x), x)
- assert problem.is_autonomous == True
- problem = SingleODEProblem(f(x).diff(x, 3) + x*f(x).diff(x, 2) - f(x)**2, f(x), x)
- assert problem.is_autonomous == False
- def test_linear_coefficients():
- _ode_solver_test(_get_examples_ode_sol_linear_coefficients)
- @slow
- def test_1st_homogeneous_coeff_ode():
- #These were marked as test_1st_homogeneous_coeff_corner_case
- eq1 = f(x).diff(x) - f(x)/x
- c1 = classify_ode(eq1, f(x))
- eq2 = x*f(x).diff(x) - f(x)
- c2 = classify_ode(eq2, f(x))
- sdi = "1st_homogeneous_coeff_subs_dep_div_indep"
- sid = "1st_homogeneous_coeff_subs_indep_div_dep"
- assert sid not in c1 and sdi not in c1
- assert sid not in c2 and sdi not in c2
- _ode_solver_test(_get_examples_ode_sol_1st_homogeneous_coeff_subs_dep_div_indep)
- _ode_solver_test(_get_examples_ode_sol_1st_homogeneous_coeff_best)
- @slow
- def test_slow_examples_1st_homogeneous_coeff_ode():
- _ode_solver_test(_get_examples_ode_sol_1st_homogeneous_coeff_subs_dep_div_indep, run_slow_test=True)
- _ode_solver_test(_get_examples_ode_sol_1st_homogeneous_coeff_best, run_slow_test=True)
- @slow
- def test_nth_linear_constant_coeff_homogeneous():
- _ode_solver_test(_get_examples_ode_sol_nth_linear_constant_coeff_homogeneous)
- @slow
- def test_slow_examples_nth_linear_constant_coeff_homogeneous():
- _ode_solver_test(_get_examples_ode_sol_nth_linear_constant_coeff_homogeneous, run_slow_test=True)
- def test_Airy_equation():
- _ode_solver_test(_get_examples_ode_sol_2nd_linear_airy)
- @slow
- def test_lie_group():
- _ode_solver_test(_get_examples_ode_sol_lie_group)
- @slow
- def test_separable_reduced():
- df = f(x).diff(x)
- eq = (x / f(x))*df + tan(x**2*f(x) / (x**2*f(x) - 1))
- assert classify_ode(eq) == ('factorable', 'separable_reduced', 'lie_group',
- 'separable_reduced_Integral')
- _ode_solver_test(_get_examples_ode_sol_separable_reduced)
- @slow
- def test_slow_examples_separable_reduced():
- _ode_solver_test(_get_examples_ode_sol_separable_reduced, run_slow_test=True)
- @slow
- def test_2nd_2F1_hypergeometric():
- _ode_solver_test(_get_examples_ode_sol_2nd_2F1_hypergeometric)
- def test_2nd_2F1_hypergeometric_integral():
- eq = x*(x-1)*f(x).diff(x, 2) + (-1+ S(7)/2*x)*f(x).diff(x) + f(x)
- sol = Eq(f(x), (C1 + C2*Integral(exp(Integral((1 - x/2)/(x*(x - 1)), x))/(1 -
- x/2)**2, x))*exp(Integral(1/(x - 1), x)/4)*exp(-Integral(7/(x -
- 1), x)/4)*hyper((S(1)/2, -1), (1,), x))
- assert sol == dsolve(eq, hint='2nd_hypergeometric_Integral')
- assert checkodesol(eq, sol) == (True, 0)
- @slow
- def test_2nd_nonlinear_autonomous_conserved():
- _ode_solver_test(_get_examples_ode_sol_2nd_nonlinear_autonomous_conserved)
- def test_2nd_nonlinear_autonomous_conserved_integral():
- eq = f(x).diff(x, 2) + asin(f(x))
- actual = [Eq(Integral(1/sqrt(C1 - 2*Integral(asin(_u), _u)), (_u, f(x))), C2 + x),
- Eq(Integral(1/sqrt(C1 - 2*Integral(asin(_u), _u)), (_u, f(x))), C2 - x)]
- solved = dsolve(eq, hint='2nd_nonlinear_autonomous_conserved_Integral', simplify=False)
- for a,s in zip(actual, solved):
- assert a.dummy_eq(s)
- # checkodesol unable to simplify solutions with f(x) in an integral equation
- assert checkodesol(eq, [s.doit() for s in solved]) == [(True, 0), (True, 0)]
- @slow
- def test_2nd_linear_bessel_equation():
- _ode_solver_test(_get_examples_ode_sol_2nd_linear_bessel)
- @slow
- def test_nth_algebraic():
- eqn = f(x) + f(x)*f(x).diff(x)
- solns = [Eq(f(x), exp(x)),
- Eq(f(x), C1*exp(C2*x))]
- solns_final = _remove_redundant_solutions(eqn, solns, 2, x)
- assert solns_final == [Eq(f(x), C1*exp(C2*x))]
- _ode_solver_test(_get_examples_ode_sol_nth_algebraic)
- @slow
- def test_slow_examples_nth_linear_constant_coeff_var_of_parameters():
- _ode_solver_test(_get_examples_ode_sol_nth_linear_var_of_parameters, run_slow_test=True)
- def test_nth_linear_constant_coeff_var_of_parameters():
- _ode_solver_test(_get_examples_ode_sol_nth_linear_var_of_parameters)
- @slow
- def test_nth_linear_constant_coeff_variation_of_parameters__integral():
- # solve_variation_of_parameters shouldn't attempt to simplify the
- # Wronskian if simplify=False. If wronskian() ever gets good enough
- # to simplify the result itself, this test might fail.
- our_hint = 'nth_linear_constant_coeff_variation_of_parameters_Integral'
- eq = f(x).diff(x, 5) + 2*f(x).diff(x, 3) + f(x).diff(x) - 2*x - exp(I*x)
- sol_simp = dsolve(eq, f(x), hint=our_hint, simplify=True)
- sol_nsimp = dsolve(eq, f(x), hint=our_hint, simplify=False)
- assert sol_simp != sol_nsimp
- assert checkodesol(eq, sol_simp, order=5, solve_for_func=False) == (True, 0)
- assert checkodesol(eq, sol_simp, order=5, solve_for_func=False) == (True, 0)
- @slow
- def test_slow_examples_1st_exact():
- _ode_solver_test(_get_examples_ode_sol_1st_exact, run_slow_test=True)
- @slow
- def test_1st_exact():
- _ode_solver_test(_get_examples_ode_sol_1st_exact)
- def test_1st_exact_integral():
- eq = cos(f(x)) - (x*sin(f(x)) - f(x)**2)*f(x).diff(x)
- sol_1 = dsolve(eq, f(x), simplify=False, hint='1st_exact_Integral')
- assert checkodesol(eq, sol_1, order=1, solve_for_func=False)
- @slow
- def test_slow_examples_nth_order_reducible():
- _ode_solver_test(_get_examples_ode_sol_nth_order_reducible, run_slow_test=True)
- @slow
- def test_slow_examples_nth_linear_constant_coeff_undetermined_coefficients():
- _ode_solver_test(_get_examples_ode_sol_nth_linear_undetermined_coefficients, run_slow_test=True)
- @slow
- def test_slow_examples_separable():
- _ode_solver_test(_get_examples_ode_sol_separable, run_slow_test=True)
- @slow
- def test_nth_linear_constant_coeff_undetermined_coefficients():
- #issue-https://github.com/sympy/sympy/issues/5787
- # This test case is to show the classification of imaginary constants under
- # nth_linear_constant_coeff_undetermined_coefficients
- eq = Eq(diff(f(x), x), I*f(x) + S.Half - I)
- our_hint = 'nth_linear_constant_coeff_undetermined_coefficients'
- assert our_hint in classify_ode(eq)
- _ode_solver_test(_get_examples_ode_sol_nth_linear_undetermined_coefficients)
- def test_nth_order_reducible():
- F = lambda eq: NthOrderReducible(SingleODEProblem(eq, f(x), x))._matches()
- D = Derivative
- assert F(D(y*f(x), x, y) + D(f(x), x)) == False
- assert F(D(y*f(y), y, y) + D(f(y), y)) == False
- assert F(f(x)*D(f(x), x) + D(f(x), x, 2))== False
- assert F(D(x*f(y), y, 2) + D(u*y*f(x), x, 3)) == False # no simplification by design
- assert F(D(f(y), y, 2) + D(f(y), y, 3) + D(f(x), x, 4)) == False
- assert F(D(f(x), x, 2) + D(f(x), x, 3)) == True
- _ode_solver_test(_get_examples_ode_sol_nth_order_reducible)
- @slow
- def test_separable():
- _ode_solver_test(_get_examples_ode_sol_separable)
- @slow
- def test_factorable():
- assert integrate(-asin(f(2*x)+pi), x) == -Integral(asin(pi + f(2*x)), x)
- _ode_solver_test(_get_examples_ode_sol_factorable)
- @slow
- def test_slow_examples_factorable():
- _ode_solver_test(_get_examples_ode_sol_factorable, run_slow_test=True)
- def test_Riccati_special_minus2():
- _ode_solver_test(_get_examples_ode_sol_riccati)
- @slow
- def test_1st_rational_riccati():
- _ode_solver_test(_get_examples_ode_sol_1st_rational_riccati)
- def test_Bernoulli():
- _ode_solver_test(_get_examples_ode_sol_bernoulli)
- def test_1st_linear():
- _ode_solver_test(_get_examples_ode_sol_1st_linear)
- def test_almost_linear():
- _ode_solver_test(_get_examples_ode_sol_almost_linear)
- @slow
- def test_Liouville_ODE():
- hint = 'Liouville'
- not_Liouville1 = classify_ode(diff(f(x), x)/x + f(x)*diff(f(x), x, x)/2 -
- diff(f(x), x)**2/2, f(x))
- not_Liouville2 = classify_ode(diff(f(x), x)/x + diff(f(x), x, x)/2 -
- x*diff(f(x), x)**2/2, f(x))
- assert hint not in not_Liouville1
- assert hint not in not_Liouville2
- assert hint + '_Integral' not in not_Liouville1
- assert hint + '_Integral' not in not_Liouville2
- _ode_solver_test(_get_examples_ode_sol_liouville)
- def test_nth_order_linear_euler_eq_homogeneous():
- x, t, a, b, c = symbols('x t a b c')
- y = Function('y')
- our_hint = "nth_linear_euler_eq_homogeneous"
- eq = diff(f(t), t, 4)*t**4 - 13*diff(f(t), t, 2)*t**2 + 36*f(t)
- assert our_hint in classify_ode(eq)
- eq = a*y(t) + b*t*diff(y(t), t) + c*t**2*diff(y(t), t, 2)
- assert our_hint in classify_ode(eq)
- _ode_solver_test(_get_examples_ode_sol_euler_homogeneous)
- def test_nth_order_linear_euler_eq_nonhomogeneous_undetermined_coefficients():
- x, t = symbols('x t')
- a, b, c, d = symbols('a b c d', integer=True)
- our_hint = "nth_linear_euler_eq_nonhomogeneous_undetermined_coefficients"
- eq = x**4*diff(f(x), x, 4) - 13*x**2*diff(f(x), x, 2) + 36*f(x) + x
- assert our_hint in classify_ode(eq, f(x))
- eq = a*x**2*diff(f(x), x, 2) + b*x*diff(f(x), x) + c*f(x) + d*log(x)
- assert our_hint in classify_ode(eq, f(x))
- _ode_solver_test(_get_examples_ode_sol_euler_undetermined_coeff)
- @slow
- def test_nth_order_linear_euler_eq_nonhomogeneous_variation_of_parameters():
- x, t = symbols('x, t')
- a, b, c, d = symbols('a, b, c, d', integer=True)
- our_hint = "nth_linear_euler_eq_nonhomogeneous_variation_of_parameters"
- eq = Eq(x**2*diff(f(x),x,2) - 8*x*diff(f(x),x) + 12*f(x), x**2)
- assert our_hint in classify_ode(eq, f(x))
- eq = Eq(a*x**3*diff(f(x),x,3) + b*x**2*diff(f(x),x,2) + c*x*diff(f(x),x) + d*f(x), x*log(x))
- assert our_hint in classify_ode(eq, f(x))
- _ode_solver_test(_get_examples_ode_sol_euler_var_para)
- @_add_example_keys
- def _get_examples_ode_sol_euler_homogeneous():
- r1, r2, r3, r4, r5 = [rootof(x**5 - 14*x**4 + 71*x**3 - 154*x**2 + 120*x - 1, n) for n in range(5)]
- return {
- 'hint': "nth_linear_euler_eq_homogeneous",
- 'func': f(x),
- 'examples':{
- 'euler_hom_01': {
- 'eq': Eq(-3*diff(f(x), x)*x + 2*x**2*diff(f(x), x, x), 0),
- 'sol': [Eq(f(x), C1 + C2*x**Rational(5, 2))],
- },
- 'euler_hom_02': {
- 'eq': Eq(3*f(x) - 5*diff(f(x), x)*x + 2*x**2*diff(f(x), x, x), 0),
- 'sol': [Eq(f(x), C1*sqrt(x) + C2*x**3)]
- },
- 'euler_hom_03': {
- 'eq': Eq(4*f(x) + 5*diff(f(x), x)*x + x**2*diff(f(x), x, x), 0),
- 'sol': [Eq(f(x), (C1 + C2*log(x))/x**2)]
- },
- 'euler_hom_04': {
- 'eq': Eq(6*f(x) - 6*diff(f(x), x)*x + 1*x**2*diff(f(x), x, x) + x**3*diff(f(x), x, x, x), 0),
- 'sol': [Eq(f(x), C1/x**2 + C2*x + C3*x**3)]
- },
- 'euler_hom_05': {
- 'eq': Eq(-125*f(x) + 61*diff(f(x), x)*x - 12*x**2*diff(f(x), x, x) + x**3*diff(f(x), x, x, x), 0),
- 'sol': [Eq(f(x), x**5*(C1 + C2*log(x) + C3*log(x)**2))]
- },
- 'euler_hom_06': {
- 'eq': x**2*diff(f(x), x, 2) + x*diff(f(x), x) - 9*f(x),
- 'sol': [Eq(f(x), C1*x**-3 + C2*x**3)]
- },
- 'euler_hom_07': {
- 'eq': sin(x)*x**2*f(x).diff(x, 2) + sin(x)*x*f(x).diff(x) + sin(x)*f(x),
- 'sol': [Eq(f(x), C1*sin(log(x)) + C2*cos(log(x)))],
- 'XFAIL': ['2nd_power_series_regular','nth_linear_euler_eq_nonhomogeneous_undetermined_coefficients']
- },
- 'euler_hom_08': {
- 'eq': x**6 * f(x).diff(x, 6) - x*f(x).diff(x) + f(x),
- 'sol': [Eq(f(x), C1*x + C2*x**r1 + C3*x**r2 + C4*x**r3 + C5*x**r4 + C6*x**r5)],
- 'checkodesol_XFAIL':True
- },
- #This example is from issue: https://github.com/sympy/sympy/issues/15237 #This example is from issue:
- # https://github.com/sympy/sympy/issues/15237
- 'euler_hom_09': {
- 'eq': Derivative(x*f(x), x, x, x),
- 'sol': [Eq(f(x), C1 + C2/x + C3*x)],
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_euler_undetermined_coeff():
- return {
- 'hint': "nth_linear_euler_eq_nonhomogeneous_undetermined_coefficients",
- 'func': f(x),
- 'examples':{
- 'euler_undet_01': {
- 'eq': Eq(x**2*diff(f(x), x, x) + x*diff(f(x), x), 1),
- 'sol': [Eq(f(x), C1 + C2*log(x) + log(x)**2/2)]
- },
- 'euler_undet_02': {
- 'eq': Eq(x**2*diff(f(x), x, x) - 2*x*diff(f(x), x) + 2*f(x), x**3),
- 'sol': [Eq(f(x), x*(C1 + C2*x + Rational(1, 2)*x**2))]
- },
- 'euler_undet_03': {
- 'eq': Eq(x**2*diff(f(x), x, x) - x*diff(f(x), x) - 3*f(x), log(x)/x),
- 'sol': [Eq(f(x), (C1 + C2*x**4 - log(x)**2/8 - log(x)/16)/x)]
- },
- 'euler_undet_04': {
- 'eq': Eq(x**2*diff(f(x), x, x) + 3*x*diff(f(x), x) - 8*f(x), log(x)**3 - log(x)),
- 'sol': [Eq(f(x), C1/x**4 + C2*x**2 - Rational(1,8)*log(x)**3 - Rational(3,32)*log(x)**2 - Rational(1,64)*log(x) - Rational(7, 256))]
- },
- 'euler_undet_05': {
- 'eq': Eq(x**3*diff(f(x), x, x, x) - 3*x**2*diff(f(x), x, x) + 6*x*diff(f(x), x) - 6*f(x), log(x)),
- 'sol': [Eq(f(x), C1*x + C2*x**2 + C3*x**3 - Rational(1, 6)*log(x) - Rational(11, 36))]
- },
- #Below examples were added for the issue: https://github.com/sympy/sympy/issues/5096
- 'euler_undet_06': {
- 'eq': 2*x**2*f(x).diff(x, 2) + f(x) + sqrt(2*x)*sin(log(2*x)/2),
- 'sol': [Eq(f(x), sqrt(x)*(C1*sin(log(x)/2) + C2*cos(log(x)/2) + sqrt(2)*log(x)*cos(log(2*x)/2)/2))]
- },
- 'euler_undet_07': {
- 'eq': 2*x**2*f(x).diff(x, 2) + f(x) + sin(log(2*x)/2),
- 'sol': [Eq(f(x), C1*sqrt(x)*sin(log(x)/2) + C2*sqrt(x)*cos(log(x)/2) - 2*sin(log(2*x)/2)/5 - 4*cos(log(2*x)/2)/5)]
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_euler_var_para():
- return {
- 'hint': "nth_linear_euler_eq_nonhomogeneous_variation_of_parameters",
- 'func': f(x),
- 'examples':{
- 'euler_var_01': {
- 'eq': Eq(x**2*Derivative(f(x), x, x) - 2*x*Derivative(f(x), x) + 2*f(x), x**4),
- 'sol': [Eq(f(x), x*(C1 + C2*x + x**3/6))]
- },
- 'euler_var_02': {
- 'eq': Eq(3*x**2*diff(f(x), x, x) + 6*x*diff(f(x), x) - 6*f(x), x**3*exp(x)),
- 'sol': [Eq(f(x), C1/x**2 + C2*x + x*exp(x)/3 - 4*exp(x)/3 + 8*exp(x)/(3*x) - 8*exp(x)/(3*x**2))]
- },
- 'euler_var_03': {
- 'eq': Eq(x**2*Derivative(f(x), x, x) - 2*x*Derivative(f(x), x) + 2*f(x), x**4*exp(x)),
- 'sol': [Eq(f(x), x*(C1 + C2*x + x*exp(x) - 2*exp(x)))]
- },
- 'euler_var_04': {
- 'eq': x**2*Derivative(f(x), x, x) - 2*x*Derivative(f(x), x) + 2*f(x) - log(x),
- 'sol': [Eq(f(x), C1*x + C2*x**2 + log(x)/2 + Rational(3, 4))]
- },
- 'euler_var_05': {
- 'eq': -exp(x) + (x*Derivative(f(x), (x, 2)) + Derivative(f(x), x))/x,
- 'sol': [Eq(f(x), C1 + C2*log(x) + exp(x) - Ei(x))]
- },
- 'euler_var_06': {
- 'eq': x**2 * f(x).diff(x, 2) + x * f(x).diff(x) + 4 * f(x) - 1/x,
- 'sol': [Eq(f(x), C1*sin(2*log(x)) + C2*cos(2*log(x)) + 1/(5*x))]
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_bernoulli():
- # Type: Bernoulli, f'(x) + p(x)*f(x) == q(x)*f(x)**n
- return {
- 'hint': "Bernoulli",
- 'func': f(x),
- 'examples':{
- 'bernoulli_01': {
- 'eq': Eq(x*f(x).diff(x) + f(x) - f(x)**2, 0),
- 'sol': [Eq(f(x), 1/(C1*x + 1))],
- 'XFAIL': ['separable_reduced']
- },
- 'bernoulli_02': {
- 'eq': f(x).diff(x) - y*f(x),
- 'sol': [Eq(f(x), C1*exp(x*y))]
- },
- 'bernoulli_03': {
- 'eq': f(x)*f(x).diff(x) - 1,
- 'sol': [Eq(f(x), -sqrt(C1 + 2*x)), Eq(f(x), sqrt(C1 + 2*x))]
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_riccati():
- # Type: Riccati special alpha = -2, a*dy/dx + b*y**2 + c*y/x +d/x**2
- return {
- 'hint': "Riccati_special_minus2",
- 'func': f(x),
- 'examples':{
- 'riccati_01': {
- 'eq': 2*f(x).diff(x) + f(x)**2 - f(x)/x + 3*x**(-2),
- 'sol': [Eq(f(x), (-sqrt(3)*tan(C1 + sqrt(3)*log(x)/4) + 3)/(2*x))],
- },
- },
- }
- @_add_example_keys
- def _get_examples_ode_sol_1st_rational_riccati():
- # Type: 1st Order Rational Riccati, dy/dx = a + b*y + c*y**2,
- # a, b, c are rational functions of x
- return {
- 'hint': "1st_rational_riccati",
- 'func': f(x),
- 'examples':{
- # a(x) is a constant
- "rational_riccati_01": {
- "eq": Eq(f(x).diff(x) + f(x)**2 - 2, 0),
- "sol": [Eq(f(x), sqrt(2)*(-C1 - exp(2*sqrt(2)*x))/(C1 - exp(2*sqrt(2)*x)))]
- },
- # a(x) is a constant
- "rational_riccati_02": {
- "eq": f(x)**2 + Derivative(f(x), x) + 4*f(x)/x + 2/x**2,
- "sol": [Eq(f(x), (-2*C1 - x)/(x*(C1 + x)))]
- },
- # a(x) is a constant
- "rational_riccati_03": {
- "eq": 2*x**2*Derivative(f(x), x) - x*(4*f(x) + Derivative(f(x), x) - 4) + (f(x) - 1)*f(x),
- "sol": [Eq(f(x), (C1 + 2*x**2)/(C1 + x))]
- },
- # Constant coefficients
- "rational_riccati_04": {
- "eq": f(x).diff(x) - 6 - 5*f(x) - f(x)**2,
- "sol": [Eq(f(x), (-2*C1 + 3*exp(x))/(C1 - exp(x)))]
- },
- # One pole of multiplicity 2
- "rational_riccati_05": {
- "eq": x**2 - (2*x + 1/x)*f(x) + f(x)**2 + Derivative(f(x), x),
- "sol": [Eq(f(x), x*(C1 + x**2 + 1)/(C1 + x**2 - 1))]
- },
- # One pole of multiplicity 2
- "rational_riccati_06": {
- "eq": x**4*Derivative(f(x), x) + x**2 - x*(2*f(x)**2 + Derivative(f(x), x)) + f(x),
- "sol": [Eq(f(x), x*(C1*x - x + 1)/(C1 + x**2 - 1))]
- },
- # Multiple poles of multiplicity 2
- "rational_riccati_07": {
- "eq": -f(x)**2 + Derivative(f(x), x) + (15*x**2 - 20*x + 7)/((x - 1)**2*(2*x \
- - 1)**2),
- "sol": [Eq(f(x), (9*C1*x - 6*C1 - 15*x**5 + 60*x**4 - 94*x**3 + 72*x**2 - \
- 33*x + 8)/(6*C1*x**2 - 9*C1*x + 3*C1 + 6*x**6 - 29*x**5 + 57*x**4 - \
- 58*x**3 + 28*x**2 - 3*x - 1))]
- },
- # Imaginary poles
- "rational_riccati_08": {
- "eq": Derivative(f(x), x) + (3*x**2 + 1)*f(x)**2/x + (6*x**2 - x + 3)*f(x)/(x*(x \
- - 1)) + (3*x**2 - 2*x + 2)/(x*(x - 1)**2),
- "sol": [Eq(f(x), (-C1 - x**3 + x**2 - 2*x + 1)/(C1*x - C1 + x**4 - x**3 + x**2 - \
- 2*x + 1))],
- },
- # Imaginary coefficients in equation
- "rational_riccati_09": {
- "eq": Derivative(f(x), x) - 2*I*(f(x)**2 + 1)/x,
- "sol": [Eq(f(x), (-I*C1 + I*x**4 + I)/(C1 + x**4 - 1))]
- },
- # Regression: linsolve returning empty solution
- # Large value of m (> 10)
- "rational_riccati_10": {
- "eq": Eq(Derivative(f(x), x), x*f(x)/(S(3)/2 - 2*x) + (x/2 - S(1)/3)*f(x)**2/\
- (2*x/3 - S(1)/2) - S(5)/4 + (281*x**2 - 1260*x + 756)/(16*x**3 - 12*x**2)),
- "sol": [Eq(f(x), (40*C1*x**14 + 28*C1*x**13 + 420*C1*x**12 + 2940*C1*x**11 + \
- 18480*C1*x**10 + 103950*C1*x**9 + 519750*C1*x**8 + 2286900*C1*x**7 + \
- 8731800*C1*x**6 + 28378350*C1*x**5 + 76403250*C1*x**4 + 163721250*C1*x**3 \
- + 261954000*C1*x**2 + 278326125*C1*x + 147349125*C1 + x*exp(2*x) - 9*exp(2*x) \
- )/(x*(24*C1*x**13 + 140*C1*x**12 + 840*C1*x**11 + 4620*C1*x**10 + 23100*C1*x**9 \
- + 103950*C1*x**8 + 415800*C1*x**7 + 1455300*C1*x**6 + 4365900*C1*x**5 + \
- 10914750*C1*x**4 + 21829500*C1*x**3 + 32744250*C1*x**2 + 32744250*C1*x + \
- 16372125*C1 - exp(2*x))))]
- }
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_1st_linear():
- # Type: first order linear form f'(x)+p(x)f(x)=q(x)
- return {
- 'hint': "1st_linear",
- 'func': f(x),
- 'examples':{
- 'linear_01': {
- 'eq': Eq(f(x).diff(x) + x*f(x), x**2),
- 'sol': [Eq(f(x), (C1 + x*exp(x**2/2)- sqrt(2)*sqrt(pi)*erfi(sqrt(2)*x/2)/2)*exp(-x**2/2))],
- },
- },
- }
- @_add_example_keys
- def _get_examples_ode_sol_factorable():
- """ some hints are marked as xfail for examples because they missed additional algebraic solution
- which could be found by Factorable hint. Fact_01 raise exception for
- nth_linear_constant_coeff_undetermined_coefficients"""
- y = Dummy('y')
- a0,a1,a2,a3,a4 = symbols('a0, a1, a2, a3, a4')
- return {
- 'hint': "factorable",
- 'func': f(x),
- 'examples':{
- 'fact_01': {
- 'eq': f(x) + f(x)*f(x).diff(x),
- 'sol': [Eq(f(x), 0), Eq(f(x), C1 - x)],
- 'XFAIL': ['separable', '1st_exact', '1st_linear', 'Bernoulli', '1st_homogeneous_coeff_best',
- '1st_homogeneous_coeff_subs_indep_div_dep', '1st_homogeneous_coeff_subs_dep_div_indep',
- 'lie_group', 'nth_linear_euler_eq_nonhomogeneous_undetermined_coefficients',
- 'nth_linear_constant_coeff_variation_of_parameters',
- 'nth_linear_euler_eq_nonhomogeneous_variation_of_parameters',
- 'nth_linear_constant_coeff_undetermined_coefficients']
- },
- 'fact_02': {
- 'eq': f(x)*(f(x).diff(x)+f(x)*x+2),
- 'sol': [Eq(f(x), (C1 - sqrt(2)*sqrt(pi)*erfi(sqrt(2)*x/2))*exp(-x**2/2)), Eq(f(x), 0)],
- 'XFAIL': ['Bernoulli', '1st_linear', 'lie_group']
- },
- 'fact_03': {
- 'eq': (f(x).diff(x)+f(x)*x**2)*(f(x).diff(x, 2) + x*f(x)),
- 'sol': [Eq(f(x), C1*airyai(-x) + C2*airybi(-x)),Eq(f(x), C1*exp(-x**3/3))]
- },
- 'fact_04': {
- 'eq': (f(x).diff(x)+f(x)*x**2)*(f(x).diff(x, 2) + f(x)),
- 'sol': [Eq(f(x), C1*exp(-x**3/3)), Eq(f(x), C1*sin(x) + C2*cos(x))]
- },
- 'fact_05': {
- 'eq': (f(x).diff(x)**2-1)*(f(x).diff(x)**2-4),
- 'sol': [Eq(f(x), C1 - x), Eq(f(x), C1 + x), Eq(f(x), C1 + 2*x), Eq(f(x), C1 - 2*x)]
- },
- 'fact_06': {
- 'eq': (f(x).diff(x, 2)-exp(f(x)))*f(x).diff(x),
- 'sol': [
- Eq(f(x), log(-C1/(cos(sqrt(-C1)*(C2 + x)) + 1))),
- Eq(f(x), log(-C1/(cos(sqrt(-C1)*(C2 - x)) + 1))),
- Eq(f(x), C1)
- ],
- 'slow': True,
- },
- 'fact_07': {
- 'eq': (f(x).diff(x)**2-1)*(f(x)*f(x).diff(x)-1),
- 'sol': [Eq(f(x), C1 - x), Eq(f(x), -sqrt(C1 + 2*x)),Eq(f(x), sqrt(C1 + 2*x)), Eq(f(x), C1 + x)]
- },
- 'fact_08': {
- 'eq': Derivative(f(x), x)**4 - 2*Derivative(f(x), x)**2 + 1,
- 'sol': [Eq(f(x), C1 - x), Eq(f(x), C1 + x)]
- },
- 'fact_09': {
- 'eq': f(x)**2*Derivative(f(x), x)**6 - 2*f(x)**2*Derivative(f(x),
- x)**4 + f(x)**2*Derivative(f(x), x)**2 - 2*f(x)*Derivative(f(x),
- x)**5 + 4*f(x)*Derivative(f(x), x)**3 - 2*f(x)*Derivative(f(x),
- x) + Derivative(f(x), x)**4 - 2*Derivative(f(x), x)**2 + 1,
- 'sol': [
- Eq(f(x), C1 - x), Eq(f(x), -sqrt(C1 + 2*x)),
- Eq(f(x), sqrt(C1 + 2*x)), Eq(f(x), C1 + x)
- ]
- },
- 'fact_10': {
- 'eq': x**4*f(x)**2 + 2*x**4*f(x)*Derivative(f(x), (x, 2)) + x**4*Derivative(f(x),
- (x, 2))**2 + 2*x**3*f(x)*Derivative(f(x), x) + 2*x**3*Derivative(f(x),
- x)*Derivative(f(x), (x, 2)) - 7*x**2*f(x)**2 - 7*x**2*f(x)*Derivative(f(x),
- (x, 2)) + x**2*Derivative(f(x), x)**2 - 7*x*f(x)*Derivative(f(x), x) + 12*f(x)**2,
- 'sol': [
- Eq(f(x), C1*besselj(2, x) + C2*bessely(2, x)),
- Eq(f(x), C1*besselj(sqrt(3), x) + C2*bessely(sqrt(3), x))
- ],
- 'slow': True,
- },
- 'fact_11': {
- 'eq': (f(x).diff(x, 2)-exp(f(x)))*(f(x).diff(x, 2)+exp(f(x))),
- 'sol': [
- Eq(f(x), log(C1/(cos(C1*sqrt(-1/C1)*(C2 + x)) - 1))),
- Eq(f(x), log(C1/(cos(C1*sqrt(-1/C1)*(C2 - x)) - 1))),
- Eq(f(x), log(C1/(1 - cos(C1*sqrt(-1/C1)*(C2 + x))))),
- Eq(f(x), log(C1/(1 - cos(C1*sqrt(-1/C1)*(C2 - x)))))
- ],
- 'dsolve_too_slow': True,
- },
- #Below examples were added for the issue: https://github.com/sympy/sympy/issues/15889
- 'fact_12': {
- 'eq': exp(f(x).diff(x))-f(x)**2,
- 'sol': [Eq(NonElementaryIntegral(1/log(y**2), (y, f(x))), C1 + x)],
- 'XFAIL': ['lie_group'] #It shows not implemented error for lie_group.
- },
- 'fact_13': {
- 'eq': f(x).diff(x)**2 - f(x)**3,
- 'sol': [Eq(f(x), 4/(C1**2 - 2*C1*x + x**2))],
- 'XFAIL': ['lie_group'] #It shows not implemented error for lie_group.
- },
- 'fact_14': {
- 'eq': f(x).diff(x)**2 - f(x),
- 'sol': [Eq(f(x), C1**2/4 - C1*x/2 + x**2/4)]
- },
- 'fact_15': {
- 'eq': f(x).diff(x)**2 - f(x)**2,
- 'sol': [Eq(f(x), C1*exp(x)), Eq(f(x), C1*exp(-x))]
- },
- 'fact_16': {
- 'eq': f(x).diff(x)**2 - f(x)**3,
- 'sol': [Eq(f(x), 4/(C1**2 - 2*C1*x + x**2))],
- },
- # kamke ode 1.1
- 'fact_17': {
- 'eq': f(x).diff(x)-(a4*x**4 + a3*x**3 + a2*x**2 + a1*x + a0)**(-1/2),
- 'sol': [Eq(f(x), C1 + Integral(1/sqrt(a0 + a1*x + a2*x**2 + a3*x**3 + a4*x**4), x))],
- 'slow': True
- },
- # This is from issue: https://github.com/sympy/sympy/issues/9446
- 'fact_18':{
- 'eq': Eq(f(2 * x), sin(Derivative(f(x)))),
- 'sol': [Eq(f(x), C1 + Integral(pi - asin(f(2*x)), x)), Eq(f(x), C1 + Integral(asin(f(2*x)), x))],
- 'checkodesol_XFAIL':True
- },
- # This is from issue: https://github.com/sympy/sympy/issues/7093
- 'fact_19': {
- 'eq': Derivative(f(x), x)**2 - x**3,
- 'sol': [Eq(f(x), C1 - 2*x**Rational(5,2)/5), Eq(f(x), C1 + 2*x**Rational(5,2)/5)],
- },
- 'fact_20': {
- 'eq': x*f(x).diff(x, 2) - x*f(x),
- 'sol': [Eq(f(x), C1*exp(-x) + C2*exp(x))],
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_almost_linear():
- from sympy.functions.special.error_functions import Ei
- A = Symbol('A', positive=True)
- f = Function('f')
- d = f(x).diff(x)
- return {
- 'hint': "almost_linear",
- 'func': f(x),
- 'examples':{
- 'almost_lin_01': {
- 'eq': x**2*f(x)**2*d + f(x)**3 + 1,
- 'sol': [Eq(f(x), (C1*exp(3/x) - 1)**Rational(1, 3)),
- Eq(f(x), (-1 - sqrt(3)*I)*(C1*exp(3/x) - 1)**Rational(1, 3)/2),
- Eq(f(x), (-1 + sqrt(3)*I)*(C1*exp(3/x) - 1)**Rational(1, 3)/2)],
- },
- 'almost_lin_02': {
- 'eq': x*f(x)*d + 2*x*f(x)**2 + 1,
- 'sol': [Eq(f(x), -sqrt((C1 - 2*Ei(4*x))*exp(-4*x))), Eq(f(x), sqrt((C1 - 2*Ei(4*x))*exp(-4*x)))]
- },
- 'almost_lin_03': {
- 'eq': x*d + x*f(x) + 1,
- 'sol': [Eq(f(x), (C1 - Ei(x))*exp(-x))]
- },
- 'almost_lin_04': {
- 'eq': x*exp(f(x))*d + exp(f(x)) + 3*x,
- 'sol': [Eq(f(x), log(C1/x - x*Rational(3, 2)))],
- },
- 'almost_lin_05': {
- 'eq': x + A*(x + diff(f(x), x) + f(x)) + diff(f(x), x) + f(x) + 2,
- 'sol': [Eq(f(x), (C1 + Piecewise(
- (x, Eq(A + 1, 0)), ((-A*x + A - x - 1)*exp(x)/(A + 1), True)))*exp(-x))],
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_liouville():
- n = Symbol('n')
- _y = Dummy('y')
- return {
- 'hint': "Liouville",
- 'func': f(x),
- 'examples':{
- 'liouville_01': {
- 'eq': diff(f(x), x)/x + diff(f(x), x, x)/2 - diff(f(x), x)**2/2,
- 'sol': [Eq(f(x), log(x/(C1 + C2*x)))],
- },
- 'liouville_02': {
- 'eq': diff(x*exp(-f(x)), x, x),
- 'sol': [Eq(f(x), log(x/(C1 + C2*x)))]
- },
- 'liouville_03': {
- 'eq': ((diff(f(x), x)/x + diff(f(x), x, x)/2 - diff(f(x), x)**2/2)*exp(-f(x))/exp(f(x))).expand(),
- 'sol': [Eq(f(x), log(x/(C1 + C2*x)))]
- },
- 'liouville_04': {
- 'eq': diff(f(x), x, x) + 1/f(x)*(diff(f(x), x))**2 + 1/x*diff(f(x), x),
- 'sol': [Eq(f(x), -sqrt(C1 + C2*log(x))), Eq(f(x), sqrt(C1 + C2*log(x)))],
- },
- 'liouville_05': {
- 'eq': x*diff(f(x), x, x) + x/f(x)*diff(f(x), x)**2 + x*diff(f(x), x),
- 'sol': [Eq(f(x), -sqrt(C1 + C2*exp(-x))), Eq(f(x), sqrt(C1 + C2*exp(-x)))],
- },
- 'liouville_06': {
- 'eq': Eq((x*exp(f(x))).diff(x, x), 0),
- 'sol': [Eq(f(x), log(C1 + C2/x))],
- },
- 'liouville_07': {
- 'eq': (diff(f(x), x)/x + diff(f(x), x, x)/2 - diff(f(x), x)**2/2)*exp(-f(x))/exp(f(x)),
- 'sol': [Eq(f(x), log(x/(C1 + C2*x)))],
- },
- 'liouville_08': {
- 'eq': x**2*diff(f(x),x) + (n*f(x) + f(x)**2)*diff(f(x),x)**2 + diff(f(x), (x, 2)),
- 'sol': [Eq(C1 + C2*lowergamma(Rational(1,3), x**3/3) + NonElementaryIntegral(exp(_y**3/3)*exp(_y**2*n/2), (_y, f(x))), 0)],
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_nth_algebraic():
- M, m, r, t = symbols('M m r t')
- phi = Function('phi')
- k = Symbol('k')
- # This one needs a substitution f' = g.
- # 'algeb_12': {
- # 'eq': -exp(x) + (x*Derivative(f(x), (x, 2)) + Derivative(f(x), x))/x,
- # 'sol': [Eq(f(x), C1 + C2*log(x) + exp(x) - Ei(x))],
- # },
- return {
- 'hint': "nth_algebraic",
- 'func': f(x),
- 'examples':{
- 'algeb_01': {
- 'eq': f(x) * f(x).diff(x) * f(x).diff(x, x) * (f(x) - 1) * (f(x).diff(x) - x),
- 'sol': [Eq(f(x), C1 + x**2/2), Eq(f(x), C1 + C2*x)]
- },
- 'algeb_02': {
- 'eq': f(x) * f(x).diff(x) * f(x).diff(x, x) * (f(x) - 1),
- 'sol': [Eq(f(x), C1 + C2*x)]
- },
- 'algeb_03': {
- 'eq': f(x) * f(x).diff(x) * f(x).diff(x, x),
- 'sol': [Eq(f(x), C1 + C2*x)]
- },
- 'algeb_04': {
- 'eq': Eq(-M * phi(t).diff(t),
- Rational(3, 2) * m * r**2 * phi(t).diff(t) * phi(t).diff(t,t)),
- 'sol': [Eq(phi(t), C1), Eq(phi(t), C1 + C2*t - M*t**2/(3*m*r**2))],
- 'func': phi(t)
- },
- 'algeb_05': {
- 'eq': (1 - sin(f(x))) * f(x).diff(x),
- 'sol': [Eq(f(x), C1)],
- 'XFAIL': ['separable'] #It raised exception.
- },
- 'algeb_06': {
- 'eq': (diff(f(x)) - x)*(diff(f(x)) + x),
- 'sol': [Eq(f(x), C1 - x**2/2), Eq(f(x), C1 + x**2/2)]
- },
- 'algeb_07': {
- 'eq': Eq(Derivative(f(x), x), Derivative(g(x), x)),
- 'sol': [Eq(f(x), C1 + g(x))],
- },
- 'algeb_08': {
- 'eq': f(x).diff(x) - C1, #this example is from issue 15999
- 'sol': [Eq(f(x), C1*x + C2)],
- },
- 'algeb_09': {
- 'eq': f(x)*f(x).diff(x),
- 'sol': [Eq(f(x), C1)],
- },
- 'algeb_10': {
- 'eq': (diff(f(x)) - x)*(diff(f(x)) + x),
- 'sol': [Eq(f(x), C1 - x**2/2), Eq(f(x), C1 + x**2/2)],
- },
- 'algeb_11': {
- 'eq': f(x) + f(x)*f(x).diff(x),
- 'sol': [Eq(f(x), 0), Eq(f(x), C1 - x)],
- 'XFAIL': ['separable', '1st_exact', '1st_linear', 'Bernoulli', '1st_homogeneous_coeff_best',
- '1st_homogeneous_coeff_subs_indep_div_dep', '1st_homogeneous_coeff_subs_dep_div_indep',
- 'lie_group', 'nth_linear_constant_coeff_undetermined_coefficients',
- 'nth_linear_euler_eq_nonhomogeneous_undetermined_coefficients',
- 'nth_linear_constant_coeff_variation_of_parameters',
- 'nth_linear_euler_eq_nonhomogeneous_variation_of_parameters']
- #nth_linear_constant_coeff_undetermined_coefficients raises exception rest all of them misses a solution.
- },
- 'algeb_12': {
- 'eq': Derivative(x*f(x), x, x, x),
- 'sol': [Eq(f(x), (C1 + C2*x + C3*x**2) / x)],
- 'XFAIL': ['nth_algebraic'] # It passes only when prep=False is set in dsolve.
- },
- 'algeb_13': {
- 'eq': Eq(Derivative(x*Derivative(f(x), x), x)/x, exp(x)),
- 'sol': [Eq(f(x), C1 + C2*log(x) + exp(x) - Ei(x))],
- 'XFAIL': ['nth_algebraic'] # It passes only when prep=False is set in dsolve.
- },
- # These are simple tests from the old ode module example 14-18
- 'algeb_14': {
- 'eq': Eq(f(x).diff(x), 0),
- 'sol': [Eq(f(x), C1)],
- },
- 'algeb_15': {
- 'eq': Eq(3*f(x).diff(x) - 5, 0),
- 'sol': [Eq(f(x), C1 + x*Rational(5, 3))],
- },
- 'algeb_16': {
- 'eq': Eq(3*f(x).diff(x), 5),
- 'sol': [Eq(f(x), C1 + x*Rational(5, 3))],
- },
- # Type: 2nd order, constant coefficients (two complex roots)
- 'algeb_17': {
- 'eq': Eq(3*f(x).diff(x) - 1, 0),
- 'sol': [Eq(f(x), C1 + x/3)],
- },
- 'algeb_18': {
- 'eq': Eq(x*f(x).diff(x) - 1, 0),
- 'sol': [Eq(f(x), C1 + log(x))],
- },
- # https://github.com/sympy/sympy/issues/6989
- 'algeb_19': {
- 'eq': f(x).diff(x) - x*exp(-k*x),
- 'sol': [Eq(f(x), C1 + Piecewise(((-k*x - 1)*exp(-k*x)/k**2, Ne(k**2, 0)),(x**2/2, True)))],
- },
- 'algeb_20': {
- 'eq': -f(x).diff(x) + x*exp(-k*x),
- 'sol': [Eq(f(x), C1 + Piecewise(((-k*x - 1)*exp(-k*x)/k**2, Ne(k**2, 0)),(x**2/2, True)))],
- },
- # https://github.com/sympy/sympy/issues/10867
- 'algeb_21': {
- 'eq': Eq(g(x).diff(x).diff(x), (x-2)**2 + (x-3)**3),
- 'sol': [Eq(g(x), C1 + C2*x + x**5/20 - 2*x**4/3 + 23*x**3/6 - 23*x**2/2)],
- 'func': g(x),
- },
- # https://github.com/sympy/sympy/issues/13691
- 'algeb_22': {
- 'eq': f(x).diff(x) - C1*g(x).diff(x),
- 'sol': [Eq(f(x), C2 + C1*g(x))],
- 'func': f(x),
- },
- # https://github.com/sympy/sympy/issues/4838
- 'algeb_23': {
- 'eq': f(x).diff(x) - 3*C1 - 3*x**2,
- 'sol': [Eq(f(x), C2 + 3*C1*x + x**3)],
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_nth_order_reducible():
- return {
- 'hint': "nth_order_reducible",
- 'func': f(x),
- 'examples':{
- 'reducible_01': {
- 'eq': Eq(x*Derivative(f(x), x)**2 + Derivative(f(x), x, 2), 0),
- 'sol': [Eq(f(x),C1 - sqrt(-1/C2)*log(-C2*sqrt(-1/C2) + x) +
- sqrt(-1/C2)*log(C2*sqrt(-1/C2) + x))],
- 'slow': True,
- },
- 'reducible_02': {
- 'eq': -exp(x) + (x*Derivative(f(x), (x, 2)) + Derivative(f(x), x))/x,
- 'sol': [Eq(f(x), C1 + C2*log(x) + exp(x) - Ei(x))],
- 'slow': True,
- },
- 'reducible_03': {
- 'eq': Eq(sqrt(2) * f(x).diff(x,x,x) + f(x).diff(x), 0),
- 'sol': [Eq(f(x), C1 + C2*sin(2**Rational(3, 4)*x/2) + C3*cos(2**Rational(3, 4)*x/2))],
- 'slow': True,
- },
- 'reducible_04': {
- 'eq': f(x).diff(x, 2) + 2*f(x).diff(x),
- 'sol': [Eq(f(x), C1 + C2*exp(-2*x))],
- },
- 'reducible_05': {
- 'eq': f(x).diff(x, 3) + f(x).diff(x, 2) - 6*f(x).diff(x),
- 'sol': [Eq(f(x), C1 + C2*exp(-3*x) + C3*exp(2*x))],
- 'slow': True,
- },
- 'reducible_06': {
- 'eq': f(x).diff(x, 4) - f(x).diff(x, 3) - 4*f(x).diff(x, 2) + \
- 4*f(x).diff(x),
- 'sol': [Eq(f(x), C1 + C2*exp(-2*x) + C3*exp(x) + C4*exp(2*x))],
- 'slow': True,
- },
- 'reducible_07': {
- 'eq': f(x).diff(x, 4) + 3*f(x).diff(x, 3),
- 'sol': [Eq(f(x), C1 + C2*x + C3*x**2 + C4*exp(-3*x))],
- 'slow': True,
- },
- 'reducible_08': {
- 'eq': f(x).diff(x, 4) - 2*f(x).diff(x, 2),
- 'sol': [Eq(f(x), C1 + C2*x + C3*exp(-sqrt(2)*x) + C4*exp(sqrt(2)*x))],
- 'slow': True,
- },
- 'reducible_09': {
- 'eq': f(x).diff(x, 4) + 4*f(x).diff(x, 2),
- 'sol': [Eq(f(x), C1 + C2*x + C3*sin(2*x) + C4*cos(2*x))],
- 'slow': True,
- },
- 'reducible_10': {
- 'eq': f(x).diff(x, 5) + 2*f(x).diff(x, 3) + f(x).diff(x),
- 'sol': [Eq(f(x), C1 + C2*x*sin(x) + C2*cos(x) - C3*x*cos(x) + C3*sin(x) + C4*sin(x) + C5*cos(x))],
- 'slow': True,
- },
- 'reducible_11': {
- 'eq': f(x).diff(x, 2) - f(x).diff(x)**3,
- 'sol': [Eq(f(x), C1 - sqrt(2)*sqrt(-1/(C2 + x))*(C2 + x)),
- Eq(f(x), C1 + sqrt(2)*sqrt(-1/(C2 + x))*(C2 + x))],
- 'slow': True,
- },
- # Needs to be a way to know how to combine derivatives in the expression
- 'reducible_12': {
- 'eq': Derivative(x*f(x), x, x, x) + Derivative(f(x), x, x, x),
- 'sol': [Eq(f(x), C1 + C3/Mul(2, (x**2 + 2*x + 1), evaluate=False) +
- x*(C2 + C3/Mul(2, (x**2 + 2*x + 1), evaluate=False)))], # 2-arg Mul!
- 'slow': True,
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_nth_linear_undetermined_coefficients():
- # examples 3-27 below are from Ordinary Differential Equations,
- # Tenenbaum and Pollard, pg. 231
- g = exp(-x)
- f2 = f(x).diff(x, 2)
- c = 3*f(x).diff(x, 3) + 5*f2 + f(x).diff(x) - f(x) - x
- t = symbols("t")
- u = symbols("u",cls=Function)
- R, L, C, E_0, alpha = symbols("R L C E_0 alpha",positive=True)
- omega = Symbol('omega')
- return {
- 'hint': "nth_linear_constant_coeff_undetermined_coefficients",
- 'func': f(x),
- 'examples':{
- 'undet_01': {
- 'eq': c - x*g,
- 'sol': [Eq(f(x), C3*exp(x/3) - x + (C1 + x*(C2 - x**2/24 - 3*x/32))*exp(-x) - 1)],
- 'slow': True,
- },
- 'undet_02': {
- 'eq': c - g,
- 'sol': [Eq(f(x), C3*exp(x/3) - x + (C1 + x*(C2 - x/8))*exp(-x) - 1)],
- 'slow': True,
- },
- 'undet_03': {
- 'eq': f2 + 3*f(x).diff(x) + 2*f(x) - 4,
- 'sol': [Eq(f(x), C1*exp(-2*x) + C2*exp(-x) + 2)],
- 'slow': True,
- },
- 'undet_04': {
- 'eq': f2 + 3*f(x).diff(x) + 2*f(x) - 12*exp(x),
- 'sol': [Eq(f(x), C1*exp(-2*x) + C2*exp(-x) + 2*exp(x))],
- 'slow': True,
- },
- 'undet_05': {
- 'eq': f2 + 3*f(x).diff(x) + 2*f(x) - exp(I*x),
- 'sol': [Eq(f(x), (S(3)/10 + I/10)*(C1*exp(-2*x) + C2*exp(-x) - I*exp(I*x)))],
- 'slow': True,
- },
- 'undet_06': {
- 'eq': f2 + 3*f(x).diff(x) + 2*f(x) - sin(x),
- 'sol': [Eq(f(x), C1*exp(-2*x) + C2*exp(-x) + sin(x)/10 - 3*cos(x)/10)],
- 'slow': True,
- },
- 'undet_07': {
- 'eq': f2 + 3*f(x).diff(x) + 2*f(x) - cos(x),
- 'sol': [Eq(f(x), C1*exp(-2*x) + C2*exp(-x) + 3*sin(x)/10 + cos(x)/10)],
- 'slow': True,
- },
- 'undet_08': {
- 'eq': f2 + 3*f(x).diff(x) + 2*f(x) - (8 + 6*exp(x) + 2*sin(x)),
- 'sol': [Eq(f(x), C1*exp(-2*x) + C2*exp(-x) + exp(x) + sin(x)/5 - 3*cos(x)/5 + 4)],
- 'slow': True,
- },
- 'undet_09': {
- 'eq': f2 + f(x).diff(x) + f(x) - x**2,
- 'sol': [Eq(f(x), -2*x + x**2 + (C1*sin(x*sqrt(3)/2) + C2*cos(x*sqrt(3)/2))*exp(-x/2))],
- 'slow': True,
- },
- 'undet_10': {
- 'eq': f2 - 2*f(x).diff(x) - 8*f(x) - 9*x*exp(x) - 10*exp(-x),
- 'sol': [Eq(f(x), -x*exp(x) - 2*exp(-x) + C1*exp(-2*x) + C2*exp(4*x))],
- 'slow': True,
- },
- 'undet_11': {
- 'eq': f2 - 3*f(x).diff(x) - 2*exp(2*x)*sin(x),
- 'sol': [Eq(f(x), C1 + C2*exp(3*x) - 3*exp(2*x)*sin(x)/5 - exp(2*x)*cos(x)/5)],
- 'slow': True,
- },
- 'undet_12': {
- 'eq': f(x).diff(x, 4) - 2*f2 + f(x) - x + sin(x),
- 'sol': [Eq(f(x), x - sin(x)/4 + (C1 + C2*x)*exp(-x) + (C3 + C4*x)*exp(x))],
- 'slow': True,
- },
- 'undet_13': {
- 'eq': f2 + f(x).diff(x) - x**2 - 2*x,
- 'sol': [Eq(f(x), C1 + x**3/3 + C2*exp(-x))],
- 'slow': True,
- },
- 'undet_14': {
- 'eq': f2 + f(x).diff(x) - x - sin(2*x),
- 'sol': [Eq(f(x), C1 - x - sin(2*x)/5 - cos(2*x)/10 + x**2/2 + C2*exp(-x))],
- 'slow': True,
- },
- 'undet_15': {
- 'eq': f2 + f(x) - 4*x*sin(x),
- 'sol': [Eq(f(x), (C1 - x**2)*cos(x) + (C2 + x)*sin(x))],
- 'slow': True,
- },
- 'undet_16': {
- 'eq': f2 + 4*f(x) - x*sin(2*x),
- 'sol': [Eq(f(x), (C1 - x**2/8)*cos(2*x) + (C2 + x/16)*sin(2*x))],
- 'slow': True,
- },
- 'undet_17': {
- 'eq': f2 + 2*f(x).diff(x) + f(x) - x**2*exp(-x),
- 'sol': [Eq(f(x), (C1 + x*(C2 + x**3/12))*exp(-x))],
- 'slow': True,
- },
- 'undet_18': {
- 'eq': f(x).diff(x, 3) + 3*f2 + 3*f(x).diff(x) + f(x) - 2*exp(-x) + \
- x**2*exp(-x),
- 'sol': [Eq(f(x), (C1 + x*(C2 + x*(C3 - x**3/60 + x/3)))*exp(-x))],
- 'slow': True,
- },
- 'undet_19': {
- 'eq': f2 + 3*f(x).diff(x) + 2*f(x) - exp(-2*x) - x**2,
- 'sol': [Eq(f(x), C2*exp(-x) + x**2/2 - x*Rational(3,2) + (C1 - x)*exp(-2*x) + Rational(7,4))],
- 'slow': True,
- },
- 'undet_20': {
- 'eq': f2 - 3*f(x).diff(x) + 2*f(x) - x*exp(-x),
- 'sol': [Eq(f(x), C1*exp(x) + C2*exp(2*x) + (6*x + 5)*exp(-x)/36)],
- 'slow': True,
- },
- 'undet_21': {
- 'eq': f2 + f(x).diff(x) - 6*f(x) - x - exp(2*x),
- 'sol': [Eq(f(x), Rational(-1, 36) - x/6 + C2*exp(-3*x) + (C1 + x/5)*exp(2*x))],
- 'slow': True,
- },
- 'undet_22': {
- 'eq': f2 + f(x) - sin(x) - exp(-x),
- 'sol': [Eq(f(x), C2*sin(x) + (C1 - x/2)*cos(x) + exp(-x)/2)],
- 'slow': True,
- },
- 'undet_23': {
- 'eq': f(x).diff(x, 3) - 3*f2 + 3*f(x).diff(x) - f(x) - exp(x),
- 'sol': [Eq(f(x), (C1 + x*(C2 + x*(C3 + x/6)))*exp(x))],
- 'slow': True,
- },
- 'undet_24': {
- 'eq': f2 + f(x) - S.Half - cos(2*x)/2,
- 'sol': [Eq(f(x), S.Half - cos(2*x)/6 + C1*sin(x) + C2*cos(x))],
- 'slow': True,
- },
- 'undet_25': {
- 'eq': f(x).diff(x, 3) - f(x).diff(x) - exp(2*x)*(S.Half - cos(2*x)/2),
- 'sol': [Eq(f(x), C1 + C2*exp(-x) + C3*exp(x) + (-21*sin(2*x) + 27*cos(2*x) + 130)*exp(2*x)/1560)],
- 'slow': True,
- },
- #Note: 'undet_26' is referred in 'undet_37'
- 'undet_26': {
- 'eq': (f(x).diff(x, 5) + 2*f(x).diff(x, 3) + f(x).diff(x) - 2*x -
- sin(x) - cos(x)),
- 'sol': [Eq(f(x), C1 + x**2 + (C2 + x*(C3 - x/8))*sin(x) + (C4 + x*(C5 + x/8))*cos(x))],
- 'slow': True,
- },
- 'undet_27': {
- 'eq': f2 + f(x) - cos(x)/2 + cos(3*x)/2,
- 'sol': [Eq(f(x), cos(3*x)/16 + C2*cos(x) + (C1 + x/4)*sin(x))],
- 'slow': True,
- },
- 'undet_28': {
- 'eq': f(x).diff(x) - 1,
- 'sol': [Eq(f(x), C1 + x)],
- 'slow': True,
- },
- # https://github.com/sympy/sympy/issues/19358
- 'undet_29': {
- 'eq': f2 + f(x).diff(x) + exp(x-C1),
- 'sol': [Eq(f(x), C2 + C3*exp(-x) - exp(-C1 + x)/2)],
- 'slow': True,
- },
- # https://github.com/sympy/sympy/issues/18408
- 'undet_30': {
- 'eq': f(x).diff(x, 3) - f(x).diff(x) - sinh(x),
- 'sol': [Eq(f(x), C1 + C2*exp(-x) + C3*exp(x) + x*sinh(x)/2)],
- },
- 'undet_31': {
- 'eq': f(x).diff(x, 2) - 49*f(x) - sinh(3*x),
- 'sol': [Eq(f(x), C1*exp(-7*x) + C2*exp(7*x) - sinh(3*x)/40)],
- },
- 'undet_32': {
- 'eq': f(x).diff(x, 3) - f(x).diff(x) - sinh(x) - exp(x),
- 'sol': [Eq(f(x), C1 + C3*exp(-x) + x*sinh(x)/2 + (C2 + x/2)*exp(x))],
- },
- # https://github.com/sympy/sympy/issues/5096
- 'undet_33': {
- 'eq': f(x).diff(x, x) + f(x) - x*sin(x - 2),
- 'sol': [Eq(f(x), C1*sin(x) + C2*cos(x) - x**2*cos(x - 2)/4 + x*sin(x - 2)/4)],
- },
- 'undet_34': {
- 'eq': f(x).diff(x, 2) + f(x) - x**4*sin(x-1),
- 'sol': [ Eq(f(x), C1*sin(x) + C2*cos(x) - x**5*cos(x - 1)/10 + x**4*sin(x - 1)/4 + x**3*cos(x - 1)/2 - 3*x**2*sin(x - 1)/4 - 3*x*cos(x - 1)/4)],
- },
- 'undet_35': {
- 'eq': f(x).diff(x, 2) - f(x) - exp(x - 1),
- 'sol': [Eq(f(x), C2*exp(-x) + (C1 + x*exp(-1)/2)*exp(x))],
- },
- 'undet_36': {
- 'eq': f(x).diff(x, 2)+f(x)-(sin(x-2)+1),
- 'sol': [Eq(f(x), C1*sin(x) + C2*cos(x) - x*cos(x - 2)/2 + 1)],
- },
- # Equivalent to example_name 'undet_26'.
- # This previously failed because the algorithm for undetermined coefficients
- # didn't know to multiply exp(I*x) by sufficient x because it is linearly
- # dependent on sin(x) and cos(x).
- 'undet_37': {
- 'eq': f(x).diff(x, 5) + 2*f(x).diff(x, 3) + f(x).diff(x) - 2*x - exp(I*x),
- 'sol': [Eq(f(x), C1 + x**2*(I*exp(I*x)/8 + 1) + (C2 + C3*x)*sin(x) + (C4 + C5*x)*cos(x))],
- },
- # https://github.com/sympy/sympy/issues/12623
- 'undet_38': {
- 'eq': Eq( u(t).diff(t,t) + R /L*u(t).diff(t) + 1/(L*C)*u(t), alpha),
- 'sol': [Eq(u(t), C*L*alpha + C2*exp(-t*(R + sqrt(C*R**2 - 4*L)/sqrt(C))/(2*L))
- + C1*exp(t*(-R + sqrt(C*R**2 - 4*L)/sqrt(C))/(2*L)))],
- 'func': u(t)
- },
- 'undet_39': {
- 'eq': Eq( L*C*u(t).diff(t,t) + R*C*u(t).diff(t) + u(t), E_0*exp(I*omega*t) ),
- 'sol': [Eq(u(t), C2*exp(-t*(R + sqrt(C*R**2 - 4*L)/sqrt(C))/(2*L))
- + C1*exp(t*(-R + sqrt(C*R**2 - 4*L)/sqrt(C))/(2*L))
- - E_0*exp(I*omega*t)/(C*L*omega**2 - I*C*R*omega - 1))],
- 'func': u(t),
- },
- # https://github.com/sympy/sympy/issues/6879
- 'undet_40': {
- 'eq': Eq(Derivative(f(x), x, 2) - 2*Derivative(f(x), x) + f(x), sin(x)),
- 'sol': [Eq(f(x), (C1 + C2*x)*exp(x) + cos(x)/2)],
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_separable():
- # test_separable1-5 are from Ordinary Differential Equations, Tenenbaum and
- # Pollard, pg. 55
- t,a = symbols('a,t')
- m = 96
- g = 9.8
- k = .2
- f1 = g * m
- v = Function('v')
- return {
- 'hint': "separable",
- 'func': f(x),
- 'examples':{
- 'separable_01': {
- 'eq': f(x).diff(x) - f(x),
- 'sol': [Eq(f(x), C1*exp(x))],
- },
- 'separable_02': {
- 'eq': x*f(x).diff(x) - f(x),
- 'sol': [Eq(f(x), C1*x)],
- },
- 'separable_03': {
- 'eq': f(x).diff(x) + sin(x),
- 'sol': [Eq(f(x), C1 + cos(x))],
- },
- 'separable_04': {
- 'eq': f(x)**2 + 1 - (x**2 + 1)*f(x).diff(x),
- 'sol': [Eq(f(x), tan(C1 + atan(x)))],
- },
- 'separable_05': {
- 'eq': f(x).diff(x)/tan(x) - f(x) - 2,
- 'sol': [Eq(f(x), C1/cos(x) - 2)],
- },
- 'separable_06': {
- 'eq': f(x).diff(x) * (1 - sin(f(x))) - 1,
- 'sol': [Eq(-x + f(x) + cos(f(x)), C1)],
- },
- 'separable_07': {
- 'eq': f(x)*x**2*f(x).diff(x) - f(x)**3 - 2*x**2*f(x).diff(x),
- 'sol': [Eq(f(x), (-x - sqrt(x*(4*C1*x + x - 4)))/(C1*x - 1)/2),
- Eq(f(x), (-x + sqrt(x*(4*C1*x + x - 4)))/(C1*x - 1)/2)],
- 'slow': True,
- },
- 'separable_08': {
- 'eq': f(x)**2 - 1 - (2*f(x) + x*f(x))*f(x).diff(x),
- 'sol': [Eq(f(x), -sqrt(C1*x**2 + 4*C1*x + 4*C1 + 1)),
- Eq(f(x), sqrt(C1*x**2 + 4*C1*x + 4*C1 + 1))],
- 'slow': True,
- },
- 'separable_09': {
- 'eq': x*log(x)*f(x).diff(x) + sqrt(1 + f(x)**2),
- 'sol': [Eq(f(x), sinh(C1 - log(log(x))))], #One more solution is f(x)=I
- 'slow': True,
- 'checkodesol_XFAIL': True,
- },
- 'separable_10': {
- 'eq': exp(x + 1)*tan(f(x)) + cos(f(x))*f(x).diff(x),
- 'sol': [Eq(E*exp(x) + log(cos(f(x)) - 1)/2 - log(cos(f(x)) + 1)/2 + cos(f(x)), C1)],
- 'slow': True,
- },
- 'separable_11': {
- 'eq': (x*cos(f(x)) + x**2*sin(f(x))*f(x).diff(x) - a**2*sin(f(x))*f(x).diff(x)),
- 'sol': [
- Eq(f(x), -acos(C1*sqrt(-a**2 + x**2)) + 2*pi),
- Eq(f(x), acos(C1*sqrt(-a**2 + x**2)))
- ],
- 'slow': True,
- },
- 'separable_12': {
- 'eq': f(x).diff(x) - f(x)*tan(x),
- 'sol': [Eq(f(x), C1/cos(x))],
- },
- 'separable_13': {
- 'eq': (x - 1)*cos(f(x))*f(x).diff(x) - 2*x*sin(f(x)),
- 'sol': [
- Eq(f(x), pi - asin(C1*(x**2 - 2*x + 1)*exp(2*x))),
- Eq(f(x), asin(C1*(x**2 - 2*x + 1)*exp(2*x)))
- ],
- },
- 'separable_14': {
- 'eq': f(x).diff(x) - f(x)*log(f(x))/tan(x),
- 'sol': [Eq(f(x), exp(C1*sin(x)))],
- },
- 'separable_15': {
- 'eq': x*f(x).diff(x) + (1 + f(x)**2)*atan(f(x)),
- 'sol': [Eq(f(x), tan(C1/x))], #Two more solutions are f(x)=0 and f(x)=I
- 'slow': True,
- 'checkodesol_XFAIL': True,
- },
- 'separable_16': {
- 'eq': f(x).diff(x) + x*(f(x) + 1),
- 'sol': [Eq(f(x), -1 + C1*exp(-x**2/2))],
- },
- 'separable_17': {
- 'eq': exp(f(x)**2)*(x**2 + 2*x + 1) + (x*f(x) + f(x))*f(x).diff(x),
- 'sol': [
- Eq(f(x), -sqrt(log(1/(C1 + x**2 + 2*x)))),
- Eq(f(x), sqrt(log(1/(C1 + x**2 + 2*x))))
- ],
- },
- 'separable_18': {
- 'eq': f(x).diff(x) + f(x),
- 'sol': [Eq(f(x), C1*exp(-x))],
- },
- 'separable_19': {
- 'eq': sin(x)*cos(2*f(x)) + cos(x)*sin(2*f(x))*f(x).diff(x),
- 'sol': [Eq(f(x), pi - acos(C1/cos(x)**2)/2), Eq(f(x), acos(C1/cos(x)**2)/2)],
- },
- 'separable_20': {
- 'eq': (1 - x)*f(x).diff(x) - x*(f(x) + 1),
- 'sol': [Eq(f(x), (C1*exp(-x) - x + 1)/(x - 1))],
- },
- 'separable_21': {
- 'eq': f(x)*diff(f(x), x) + x - 3*x*f(x)**2,
- 'sol': [Eq(f(x), -sqrt(3)*sqrt(C1*exp(3*x**2) + 1)/3),
- Eq(f(x), sqrt(3)*sqrt(C1*exp(3*x**2) + 1)/3)],
- },
- 'separable_22': {
- 'eq': f(x).diff(x) - exp(x + f(x)),
- 'sol': [Eq(f(x), log(-1/(C1 + exp(x))))],
- 'XFAIL': ['lie_group'] #It shows 'NoneType' object is not subscriptable for lie_group.
- },
- # https://github.com/sympy/sympy/issues/7081
- 'separable_23': {
- 'eq': x*(f(x).diff(x)) + 1 - f(x)**2,
- 'sol': [Eq(f(x), (-C1 - x**2)/(-C1 + x**2))],
- },
- # https://github.com/sympy/sympy/issues/10379
- 'separable_24': {
- 'eq': f(t).diff(t)-(1-51.05*y*f(t)),
- 'sol': [Eq(f(t), (0.019588638589618023*exp(y*(C1 - 51.049999999999997*t)) + 0.019588638589618023)/y)],
- 'func': f(t),
- },
- # https://github.com/sympy/sympy/issues/15999
- 'separable_25': {
- 'eq': f(x).diff(x) - C1*f(x),
- 'sol': [Eq(f(x), C2*exp(C1*x))],
- },
- 'separable_26': {
- 'eq': f1 - k * (v(t) ** 2) - m * Derivative(v(t)),
- 'sol': [Eq(v(t), -68.585712797928991/tanh(C1 - 0.14288690166235204*t))],
- 'func': v(t),
- 'checkodesol_XFAIL': True,
- },
- #https://github.com/sympy/sympy/issues/22155
- 'separable_27': {
- 'eq': f(x).diff(x) - exp(f(x) - x),
- 'sol': [Eq(f(x), log(-exp(x)/(C1*exp(x) - 1)))],
- }
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_1st_exact():
- # Type: Exact differential equation, p(x,f) + q(x,f)*f' == 0,
- # where dp/df == dq/dx
- '''
- Example 7 is an exact equation that fails under the exact engine. It is caught
- by first order homogeneous albeit with a much contorted solution. The
- exact engine fails because of a poorly simplified integral of q(0,y)dy,
- where q is the function multiplying f'. The solutions should be
- Eq(sqrt(x**2+f(x)**2)**3+y**3, C1). The equation below is
- equivalent, but it is so complex that checkodesol fails, and takes a long
- time to do so.
- '''
- return {
- 'hint': "1st_exact",
- 'func': f(x),
- 'examples':{
- '1st_exact_01': {
- 'eq': sin(x)*cos(f(x)) + cos(x)*sin(f(x))*f(x).diff(x),
- 'sol': [Eq(f(x), -acos(C1/cos(x)) + 2*pi), Eq(f(x), acos(C1/cos(x)))],
- 'slow': True,
- },
- '1st_exact_02': {
- 'eq': (2*x*f(x) + 1)/f(x) + (f(x) - x)/f(x)**2*f(x).diff(x),
- 'sol': [Eq(f(x), exp(C1 - x**2 + LambertW(-x*exp(-C1 + x**2))))],
- 'XFAIL': ['lie_group'], #It shows dsolve raises an exception: List index out of range for lie_group
- 'slow': True,
- 'checkodesol_XFAIL':True
- },
- '1st_exact_03': {
- 'eq': 2*x + f(x)*cos(x) + (2*f(x) + sin(x) - sin(f(x)))*f(x).diff(x),
- 'sol': [Eq(f(x)*sin(x) + cos(f(x)) + x**2 + f(x)**2, C1)],
- 'XFAIL': ['lie_group'], #It goes into infinite loop for lie_group.
- 'slow': True,
- },
- '1st_exact_04': {
- 'eq': cos(f(x)) - (x*sin(f(x)) - f(x)**2)*f(x).diff(x),
- 'sol': [Eq(x*cos(f(x)) + f(x)**3/3, C1)],
- 'slow': True,
- },
- '1st_exact_05': {
- 'eq': 2*x*f(x) + (x**2 + f(x)**2)*f(x).diff(x),
- 'sol': [Eq(x**2*f(x) + f(x)**3/3, C1)],
- 'slow': True,
- 'simplify_flag':False
- },
- # This was from issue: https://github.com/sympy/sympy/issues/11290
- '1st_exact_06': {
- 'eq': cos(f(x)) - (x*sin(f(x)) - f(x)**2)*f(x).diff(x),
- 'sol': [Eq(x*cos(f(x)) + f(x)**3/3, C1)],
- 'simplify_flag':False
- },
- '1st_exact_07': {
- 'eq': x*sqrt(x**2 + f(x)**2) - (x**2*f(x)/(f(x) - sqrt(x**2 + f(x)**2)))*f(x).diff(x),
- 'sol': [Eq(log(x),
- C1 - 9*sqrt(1 + f(x)**2/x**2)*asinh(f(x)/x)/(-27*f(x)/x +
- 27*sqrt(1 + f(x)**2/x**2)) - 9*sqrt(1 + f(x)**2/x**2)*
- log(1 - sqrt(1 + f(x)**2/x**2)*f(x)/x + 2*f(x)**2/x**2)/
- (-27*f(x)/x + 27*sqrt(1 + f(x)**2/x**2)) +
- 9*asinh(f(x)/x)*f(x)/(x*(-27*f(x)/x + 27*sqrt(1 + f(x)**2/x**2))) +
- 9*f(x)*log(1 - sqrt(1 + f(x)**2/x**2)*f(x)/x + 2*f(x)**2/x**2)/
- (x*(-27*f(x)/x + 27*sqrt(1 + f(x)**2/x**2))))],
- 'slow': True,
- 'dsolve_too_slow':True
- },
- # Type: a(x)f'(x)+b(x)*f(x)+c(x)=0
- '1st_exact_08': {
- 'eq': Eq(x**2*f(x).diff(x) + 3*x*f(x) - sin(x)/x, 0),
- 'sol': [Eq(f(x), (C1 - cos(x))/x**3)],
- },
- # these examples are from test_exact_enhancement
- '1st_exact_09': {
- 'eq': f(x)/x**2 + ((f(x)*x - 1)/x)*f(x).diff(x),
- 'sol': [Eq(f(x), (i*sqrt(C1*x**2 + 1) + 1)/x) for i in (-1, 1)],
- },
- '1st_exact_10': {
- 'eq': (x*f(x) - 1) + f(x).diff(x)*(x**2 - x*f(x)),
- 'sol': [Eq(f(x), x - sqrt(C1 + x**2 - 2*log(x))), Eq(f(x), x + sqrt(C1 + x**2 - 2*log(x)))],
- },
- '1st_exact_11': {
- 'eq': (x + 2)*sin(f(x)) + f(x).diff(x)*x*cos(f(x)),
- 'sol': [Eq(f(x), -asin(C1*exp(-x)/x**2) + pi), Eq(f(x), asin(C1*exp(-x)/x**2))],
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_nth_linear_var_of_parameters():
- g = exp(-x)
- f2 = f(x).diff(x, 2)
- c = 3*f(x).diff(x, 3) + 5*f2 + f(x).diff(x) - f(x) - x
- return {
- 'hint': "nth_linear_constant_coeff_variation_of_parameters",
- 'func': f(x),
- 'examples':{
- 'var_of_parameters_01': {
- 'eq': c - x*g,
- 'sol': [Eq(f(x), C3*exp(x/3) - x + (C1 + x*(C2 - x**2/24 - 3*x/32))*exp(-x) - 1)],
- 'slow': True,
- },
- 'var_of_parameters_02': {
- 'eq': c - g,
- 'sol': [Eq(f(x), C3*exp(x/3) - x + (C1 + x*(C2 - x/8))*exp(-x) - 1)],
- 'slow': True,
- },
- 'var_of_parameters_03': {
- 'eq': f(x).diff(x) - 1,
- 'sol': [Eq(f(x), C1 + x)],
- 'slow': True,
- },
- 'var_of_parameters_04': {
- 'eq': f2 + 3*f(x).diff(x) + 2*f(x) - 4,
- 'sol': [Eq(f(x), C1*exp(-2*x) + C2*exp(-x) + 2)],
- 'slow': True,
- },
- 'var_of_parameters_05': {
- 'eq': f2 + 3*f(x).diff(x) + 2*f(x) - 12*exp(x),
- 'sol': [Eq(f(x), C1*exp(-2*x) + C2*exp(-x) + 2*exp(x))],
- 'slow': True,
- },
- 'var_of_parameters_06': {
- 'eq': f2 - 2*f(x).diff(x) - 8*f(x) - 9*x*exp(x) - 10*exp(-x),
- 'sol': [Eq(f(x), -x*exp(x) - 2*exp(-x) + C1*exp(-2*x) + C2*exp(4*x))],
- 'slow': True,
- },
- 'var_of_parameters_07': {
- 'eq': f2 + 2*f(x).diff(x) + f(x) - x**2*exp(-x),
- 'sol': [Eq(f(x), (C1 + x*(C2 + x**3/12))*exp(-x))],
- 'slow': True,
- },
- 'var_of_parameters_08': {
- 'eq': f2 - 3*f(x).diff(x) + 2*f(x) - x*exp(-x),
- 'sol': [Eq(f(x), C1*exp(x) + C2*exp(2*x) + (6*x + 5)*exp(-x)/36)],
- 'slow': True,
- },
- 'var_of_parameters_09': {
- 'eq': f(x).diff(x, 3) - 3*f2 + 3*f(x).diff(x) - f(x) - exp(x),
- 'sol': [Eq(f(x), (C1 + x*(C2 + x*(C3 + x/6)))*exp(x))],
- 'slow': True,
- },
- 'var_of_parameters_10': {
- 'eq': f2 + 2*f(x).diff(x) + f(x) - exp(-x)/x,
- 'sol': [Eq(f(x), (C1 + x*(C2 + log(x)))*exp(-x))],
- 'slow': True,
- },
- 'var_of_parameters_11': {
- 'eq': f2 + f(x) - 1/sin(x)*1/cos(x),
- 'sol': [Eq(f(x), (C1 + log(sin(x) - 1)/2 - log(sin(x) + 1)/2
- )*cos(x) + (C2 + log(cos(x) - 1)/2 - log(cos(x) + 1)/2)*sin(x))],
- 'slow': True,
- },
- 'var_of_parameters_12': {
- 'eq': f(x).diff(x, 4) - 1/x,
- 'sol': [Eq(f(x), C1 + C2*x + C3*x**2 + x**3*(C4 + log(x)/6))],
- 'slow': True,
- },
- # These were from issue: https://github.com/sympy/sympy/issues/15996
- 'var_of_parameters_13': {
- 'eq': f(x).diff(x, 5) + 2*f(x).diff(x, 3) + f(x).diff(x) - 2*x - exp(I*x),
- 'sol': [Eq(f(x), C1 + x**2 + (C2 + x*(C3 - x/8 + 3*exp(I*x)/2 + 3*exp(-I*x)/2) + 5*exp(2*I*x)/16 + 2*I*exp(I*x) - 2*I*exp(-I*x))*sin(x) + (C4 + x*(C5 + I*x/8 + 3*I*exp(I*x)/2 - 3*I*exp(-I*x)/2)
- + 5*I*exp(2*I*x)/16 - 2*exp(I*x) - 2*exp(-I*x))*cos(x) - I*exp(I*x))],
- },
- 'var_of_parameters_14': {
- 'eq': f(x).diff(x, 5) + 2*f(x).diff(x, 3) + f(x).diff(x) - exp(I*x),
- 'sol': [Eq(f(x), C1 + (C2 + x*(C3 - x/8) + 5*exp(2*I*x)/16)*sin(x) + (C4 + x*(C5 + I*x/8) + 5*I*exp(2*I*x)/16)*cos(x) - I*exp(I*x))],
- },
- # https://github.com/sympy/sympy/issues/14395
- 'var_of_parameters_15': {
- 'eq': Derivative(f(x), x, x) + 9*f(x) - sec(x),
- 'sol': [Eq(f(x), (C1 - x/3 + sin(2*x)/3)*sin(3*x) + (C2 + log(cos(x))
- - 2*log(cos(x)**2)/3 + 2*cos(x)**2/3)*cos(3*x))],
- 'slow': True,
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_2nd_linear_bessel():
- return {
- 'hint': "2nd_linear_bessel",
- 'func': f(x),
- 'examples':{
- '2nd_lin_bessel_01': {
- 'eq': x**2*(f(x).diff(x, 2)) + x*(f(x).diff(x)) + (x**2 - 4)*f(x),
- 'sol': [Eq(f(x), C1*besselj(2, x) + C2*bessely(2, x))],
- },
- '2nd_lin_bessel_02': {
- 'eq': x**2*(f(x).diff(x, 2)) + x*(f(x).diff(x)) + (x**2 +25)*f(x),
- 'sol': [Eq(f(x), C1*besselj(5*I, x) + C2*bessely(5*I, x))],
- },
- '2nd_lin_bessel_03': {
- 'eq': x**2*(f(x).diff(x, 2)) + x*(f(x).diff(x)) + (x**2)*f(x),
- 'sol': [Eq(f(x), C1*besselj(0, x) + C2*bessely(0, x))],
- },
- '2nd_lin_bessel_04': {
- 'eq': x**2*(f(x).diff(x, 2)) + x*(f(x).diff(x)) + (81*x**2 -S(1)/9)*f(x),
- 'sol': [Eq(f(x), C1*besselj(S(1)/3, 9*x) + C2*bessely(S(1)/3, 9*x))],
- },
- '2nd_lin_bessel_05': {
- 'eq': x**2*(f(x).diff(x, 2)) + x*(f(x).diff(x)) + (x**4 - 4)*f(x),
- 'sol': [Eq(f(x), C1*besselj(1, x**2/2) + C2*bessely(1, x**2/2))],
- },
- '2nd_lin_bessel_06': {
- 'eq': x**2*(f(x).diff(x, 2)) + 2*x*(f(x).diff(x)) + (x**4 - 4)*f(x),
- 'sol': [Eq(f(x), (C1*besselj(sqrt(17)/4, x**2/2) + C2*bessely(sqrt(17)/4, x**2/2))/sqrt(x))],
- },
- '2nd_lin_bessel_07': {
- 'eq': x**2*(f(x).diff(x, 2)) + x*(f(x).diff(x)) + (x**2 - S(1)/4)*f(x),
- 'sol': [Eq(f(x), C1*besselj(S(1)/2, x) + C2*bessely(S(1)/2, x))],
- },
- '2nd_lin_bessel_08': {
- 'eq': x**2*(f(x).diff(x, 2)) - 3*x*(f(x).diff(x)) + (4*x + 4)*f(x),
- 'sol': [Eq(f(x), x**2*(C1*besselj(0, 4*sqrt(x)) + C2*bessely(0, 4*sqrt(x))))],
- },
- '2nd_lin_bessel_09': {
- 'eq': x*(f(x).diff(x, 2)) - f(x).diff(x) + 4*x**3*f(x),
- 'sol': [Eq(f(x), x*(C1*besselj(S(1)/2, x**2) + C2*bessely(S(1)/2, x**2)))],
- },
- '2nd_lin_bessel_10': {
- 'eq': (x-2)**2*(f(x).diff(x, 2)) - (x-2)*f(x).diff(x) + 4*(x-2)**2*f(x),
- 'sol': [Eq(f(x), (x - 2)*(C1*besselj(1, 2*x - 4) + C2*bessely(1, 2*x - 4)))],
- },
- # https://github.com/sympy/sympy/issues/4414
- '2nd_lin_bessel_11': {
- 'eq': f(x).diff(x, x) + 2/x*f(x).diff(x) + f(x),
- 'sol': [Eq(f(x), (C1*besselj(S(1)/2, x) + C2*bessely(S(1)/2, x))/sqrt(x))],
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_2nd_2F1_hypergeometric():
- return {
- 'hint': "2nd_hypergeometric",
- 'func': f(x),
- 'examples':{
- '2nd_2F1_hyper_01': {
- 'eq': x*(x-1)*f(x).diff(x, 2) + (S(3)/2 -2*x)*f(x).diff(x) + 2*f(x),
- 'sol': [Eq(f(x), C1*x**(S(5)/2)*hyper((S(3)/2, S(1)/2), (S(7)/2,), x) + C2*hyper((-1, -2), (-S(3)/2,), x))],
- },
- '2nd_2F1_hyper_02': {
- 'eq': x*(x-1)*f(x).diff(x, 2) + (S(7)/2*x)*f(x).diff(x) + f(x),
- 'sol': [Eq(f(x), (C1*(1 - x)**(S(5)/2)*hyper((S(1)/2, 2), (S(7)/2,), 1 - x) +
- C2*hyper((-S(1)/2, -2), (-S(3)/2,), 1 - x))/(x - 1)**(S(5)/2))],
- },
- '2nd_2F1_hyper_03': {
- 'eq': x*(x-1)*f(x).diff(x, 2) + (S(3)+ S(7)/2*x)*f(x).diff(x) + f(x),
- 'sol': [Eq(f(x), (C1*(1 - x)**(S(11)/2)*hyper((S(1)/2, 2), (S(13)/2,), 1 - x) +
- C2*hyper((-S(7)/2, -5), (-S(9)/2,), 1 - x))/(x - 1)**(S(11)/2))],
- },
- '2nd_2F1_hyper_04': {
- 'eq': -x**(S(5)/7)*(-416*x**(S(9)/7)/9 - 2385*x**(S(5)/7)/49 + S(298)*x/3)*f(x)/(196*(-x**(S(6)/7) +
- x)**2*(x**(S(6)/7) + x)**2) + Derivative(f(x), (x, 2)),
- 'sol': [Eq(f(x), x**(S(45)/98)*(C1*x**(S(4)/49)*hyper((S(1)/3, -S(1)/2), (S(9)/7,), x**(S(2)/7)) +
- C2*hyper((S(1)/21, -S(11)/14), (S(5)/7,), x**(S(2)/7)))/(x**(S(2)/7) - 1)**(S(19)/84))],
- 'checkodesol_XFAIL':True,
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_2nd_nonlinear_autonomous_conserved():
- return {
- 'hint': "2nd_nonlinear_autonomous_conserved",
- 'func': f(x),
- 'examples': {
- '2nd_nonlinear_autonomous_conserved_01': {
- 'eq': f(x).diff(x, 2) + exp(f(x)) + log(f(x)),
- 'sol': [
- Eq(Integral(1/sqrt(C1 - 2*_u*log(_u) + 2*_u - 2*exp(_u)), (_u, f(x))), C2 + x),
- Eq(Integral(1/sqrt(C1 - 2*_u*log(_u) + 2*_u - 2*exp(_u)), (_u, f(x))), C2 - x)
- ],
- 'simplify_flag': False,
- },
- '2nd_nonlinear_autonomous_conserved_02': {
- 'eq': f(x).diff(x, 2) + cbrt(f(x)) + 1/f(x),
- 'sol': [
- Eq(sqrt(2)*Integral(1/sqrt(2*C1 - 3*_u**Rational(4, 3) - 4*log(_u)), (_u, f(x))), C2 + x),
- Eq(sqrt(2)*Integral(1/sqrt(2*C1 - 3*_u**Rational(4, 3) - 4*log(_u)), (_u, f(x))), C2 - x)
- ],
- 'simplify_flag': False,
- },
- '2nd_nonlinear_autonomous_conserved_03': {
- 'eq': f(x).diff(x, 2) + sin(f(x)),
- 'sol': [
- Eq(Integral(1/sqrt(C1 + 2*cos(_u)), (_u, f(x))), C2 + x),
- Eq(Integral(1/sqrt(C1 + 2*cos(_u)), (_u, f(x))), C2 - x)
- ],
- 'simplify_flag': False,
- },
- '2nd_nonlinear_autonomous_conserved_04': {
- 'eq': f(x).diff(x, 2) + cosh(f(x)),
- 'sol': [
- Eq(Integral(1/sqrt(C1 - 2*sinh(_u)), (_u, f(x))), C2 + x),
- Eq(Integral(1/sqrt(C1 - 2*sinh(_u)), (_u, f(x))), C2 - x)
- ],
- 'simplify_flag': False,
- },
- '2nd_nonlinear_autonomous_conserved_05': {
- 'eq': f(x).diff(x, 2) + asin(f(x)),
- 'sol': [
- Eq(Integral(1/sqrt(C1 - 2*_u*asin(_u) - 2*sqrt(1 - _u**2)), (_u, f(x))), C2 + x),
- Eq(Integral(1/sqrt(C1 - 2*_u*asin(_u) - 2*sqrt(1 - _u**2)), (_u, f(x))), C2 - x)
- ],
- 'simplify_flag': False,
- 'XFAIL': ['2nd_nonlinear_autonomous_conserved_Integral']
- }
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_separable_reduced():
- df = f(x).diff(x)
- return {
- 'hint': "separable_reduced",
- 'func': f(x),
- 'examples':{
- 'separable_reduced_01': {
- 'eq': x* df + f(x)* (1 / (x**2*f(x) - 1)),
- 'sol': [Eq(log(x**2*f(x))/3 + log(x**2*f(x) - Rational(3, 2))/6, C1 + log(x))],
- 'simplify_flag': False,
- 'XFAIL': ['lie_group'], #It hangs.
- },
- #Note: 'separable_reduced_02' is referred in 'separable_reduced_11'
- 'separable_reduced_02': {
- 'eq': f(x).diff(x) + (f(x) / (x**4*f(x) - x)),
- 'sol': [Eq(log(x**3*f(x))/4 + log(x**3*f(x) - Rational(4,3))/12, C1 + log(x))],
- 'simplify_flag': False,
- 'checkodesol_XFAIL':True, #It hangs for this.
- },
- 'separable_reduced_03': {
- 'eq': x*df + f(x)*(x**2*f(x)),
- 'sol': [Eq(log(x**2*f(x))/2 - log(x**2*f(x) - 2)/2, C1 + log(x))],
- 'simplify_flag': False,
- },
- 'separable_reduced_04': {
- 'eq': Eq(f(x).diff(x) + f(x)/x * (1 + (x**(S(2)/3)*f(x))**2), 0),
- 'sol': [Eq(-3*log(x**(S(2)/3)*f(x)) + 3*log(3*x**(S(4)/3)*f(x)**2 + 1)/2, C1 + log(x))],
- 'simplify_flag': False,
- },
- 'separable_reduced_05': {
- 'eq': Eq(f(x).diff(x) + f(x)/x * (1 + (x*f(x))**2), 0),
- 'sol': [Eq(f(x), -sqrt(2)*sqrt(1/(C1 + log(x)))/(2*x)),\
- Eq(f(x), sqrt(2)*sqrt(1/(C1 + log(x)))/(2*x))],
- },
- 'separable_reduced_06': {
- 'eq': Eq(f(x).diff(x) + (x**4*f(x)**2 + x**2*f(x))*f(x)/(x*(x**6*f(x)**3 + x**4*f(x)**2)), 0),
- 'sol': [Eq(f(x), C1 + 1/(2*x**2))],
- },
- 'separable_reduced_07': {
- 'eq': Eq(f(x).diff(x) + (f(x)**2)*f(x)/(x), 0),
- 'sol': [
- Eq(f(x), -sqrt(2)*sqrt(1/(C1 + log(x)))/2),
- Eq(f(x), sqrt(2)*sqrt(1/(C1 + log(x)))/2)
- ],
- },
- 'separable_reduced_08': {
- 'eq': Eq(f(x).diff(x) + (f(x)+3)*f(x)/(x*(f(x)+2)), 0),
- 'sol': [Eq(-log(f(x) + 3)/3 - 2*log(f(x))/3, C1 + log(x))],
- 'simplify_flag': False,
- 'XFAIL': ['lie_group'], #It hangs.
- },
- 'separable_reduced_09': {
- 'eq': Eq(f(x).diff(x) + (f(x)+3)*f(x)/x, 0),
- 'sol': [Eq(f(x), 3/(C1*x**3 - 1))],
- },
- 'separable_reduced_10': {
- 'eq': Eq(f(x).diff(x) + (f(x)**2+f(x))*f(x)/(x), 0),
- 'sol': [Eq(- log(x) - log(f(x) + 1) + log(f(x)) + 1/f(x), C1)],
- 'XFAIL': ['lie_group'],#No algorithms are implemented to solve equation -C1 + x*(_y + 1)*exp(-1/_y)/_y
- },
- # Equivalent to example_name 'separable_reduced_02'. Only difference is testing with simplify=True
- 'separable_reduced_11': {
- 'eq': f(x).diff(x) + (f(x) / (x**4*f(x) - x)),
- 'sol': [Eq(f(x), -sqrt(2)*sqrt(3*3**Rational(1,3)*(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3)
- - 3*3**Rational(2,3)*exp(12*C1)/(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3) + 2/x**6)/6
- - sqrt(2)*sqrt(-3*3**Rational(1,3)*(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3)
- + 3*3**Rational(2,3)*exp(12*C1)/(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3) + 4/x**6
- - 4*sqrt(2)/(x**9*sqrt(3*3**Rational(1,3)*(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3)
- - 3*3**Rational(2,3)*exp(12*C1)/(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3) + 2/x**6)))/6 + 1/(3*x**3)),
- Eq(f(x), -sqrt(2)*sqrt(3*3**Rational(1,3)*(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3)
- - 3*3**Rational(2,3)*exp(12*C1)/(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3) + 2/x**6)/6
- + sqrt(2)*sqrt(-3*3**Rational(1,3)*(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3)
- + 3*3**Rational(2,3)*exp(12*C1)/(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3) + 4/x**6
- - 4*sqrt(2)/(x**9*sqrt(3*3**Rational(1,3)*(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3)
- - 3*3**Rational(2,3)*exp(12*C1)/(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3) + 2/x**6)))/6 + 1/(3*x**3)),
- Eq(f(x), sqrt(2)*sqrt(3*3**Rational(1,3)*(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3)
- - 3*3**Rational(2,3)*exp(12*C1)/(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3) + 2/x**6)/6
- - sqrt(2)*sqrt(-3*3**Rational(1,3)*(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3)
- + 3*3**Rational(2,3)*exp(12*C1)/(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3)
- + 4/x**6 + 4*sqrt(2)/(x**9*sqrt(3*3**Rational(1,3)*(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3)
- - 3*3**Rational(2,3)*exp(12*C1)/(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3) + 2/x**6)))/6 + 1/(3*x**3)),
- Eq(f(x), sqrt(2)*sqrt(3*3**Rational(1,3)*(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3)
- - 3*3**Rational(2,3)*exp(12*C1)/(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3) + 2/x**6)/6
- + sqrt(2)*sqrt(-3*3**Rational(1,3)*(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3) + 3*3**Rational(2,3)*exp(12*C1)/(sqrt((3*exp(12*C1)
- + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3) + 4/x**6 + 4*sqrt(2)/(x**9*sqrt(3*3**Rational(1,3)*(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1))
- - exp(12*C1)/x**6)**Rational(1,3) - 3*3**Rational(2,3)*exp(12*C1)/(sqrt((3*exp(12*C1) + x**(-12))*exp(24*C1)) - exp(12*C1)/x**6)**Rational(1,3) + 2/x**6)))/6 + 1/(3*x**3))],
- 'checkodesol_XFAIL':True, #It hangs for this.
- 'slow': True,
- },
- #These were from issue: https://github.com/sympy/sympy/issues/6247
- 'separable_reduced_12': {
- 'eq': x**2*f(x)**2 + x*Derivative(f(x), x),
- 'sol': [Eq(f(x), 2*C1/(C1*x**2 - 1))],
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_lie_group():
- a, b, c = symbols("a b c")
- return {
- 'hint': "lie_group",
- 'func': f(x),
- 'examples':{
- #Example 1-4 and 19-20 were from issue: https://github.com/sympy/sympy/issues/17322
- 'lie_group_01': {
- 'eq': x*f(x).diff(x)*(f(x)+4) + (f(x)**2) -2*f(x)-2*x,
- 'sol': [],
- 'dsolve_too_slow': True,
- 'checkodesol_too_slow': True,
- },
- 'lie_group_02': {
- 'eq': x*f(x).diff(x)*(f(x)+4) + (f(x)**2) -2*f(x)-2*x,
- 'sol': [],
- 'dsolve_too_slow': True,
- },
- 'lie_group_03': {
- 'eq': Eq(x**7*Derivative(f(x), x) + 5*x**3*f(x)**2 - (2*x**2 + 2)*f(x)**3, 0),
- 'sol': [],
- 'dsolve_too_slow': True,
- },
- 'lie_group_04': {
- 'eq': f(x).diff(x) - (f(x) - x*log(x))**2/x**2 + log(x),
- 'sol': [],
- 'XFAIL': ['lie_group'],
- },
- 'lie_group_05': {
- 'eq': f(x).diff(x)**2,
- 'sol': [Eq(f(x), C1)],
- 'XFAIL': ['factorable'], #It raises Not Implemented error
- },
- 'lie_group_06': {
- 'eq': Eq(f(x).diff(x), x**2*f(x)),
- 'sol': [Eq(f(x), C1*exp(x**3)**Rational(1, 3))],
- },
- 'lie_group_07': {
- 'eq': f(x).diff(x) + a*f(x) - c*exp(b*x),
- 'sol': [Eq(f(x), Piecewise(((-C1*(a + b) + c*exp(x*(a + b)))*exp(-a*x)/(a + b),\
- Ne(a, -b)), ((-C1 + c*x)*exp(-a*x), True)))],
- },
- 'lie_group_08': {
- 'eq': f(x).diff(x) + 2*x*f(x) - x*exp(-x**2),
- 'sol': [Eq(f(x), (C1 + x**2/2)*exp(-x**2))],
- },
- 'lie_group_09': {
- 'eq': (1 + 2*x)*(f(x).diff(x)) + 2 - 4*exp(-f(x)),
- 'sol': [Eq(f(x), log(C1/(2*x + 1) + 2))],
- },
- 'lie_group_10': {
- 'eq': x**2*(f(x).diff(x)) - f(x) + x**2*exp(x - (1/x)),
- 'sol': [Eq(f(x), (C1 - exp(x))*exp(-1/x))],
- 'XFAIL': ['factorable'], #It raises Recursion Error (maixmum depth exceeded)
- },
- 'lie_group_11': {
- 'eq': x**2*f(x)**2 + x*Derivative(f(x), x),
- 'sol': [Eq(f(x), 2/(C1 + x**2))],
- },
- 'lie_group_12': {
- 'eq': diff(f(x),x) + 2*x*f(x) - x*exp(-x**2),
- 'sol': [Eq(f(x), exp(-x**2)*(C1 + x**2/2))],
- },
- 'lie_group_13': {
- 'eq': diff(f(x),x) + f(x)*cos(x) - exp(2*x),
- 'sol': [Eq(f(x), exp(-sin(x))*(C1 + Integral(exp(2*x)*exp(sin(x)), x)))],
- },
- 'lie_group_14': {
- 'eq': diff(f(x),x) + f(x)*cos(x) - sin(2*x)/2,
- 'sol': [Eq(f(x), C1*exp(-sin(x)) + sin(x) - 1)],
- },
- 'lie_group_15': {
- 'eq': x*diff(f(x),x) + f(x) - x*sin(x),
- 'sol': [Eq(f(x), (C1 - x*cos(x) + sin(x))/x)],
- },
- 'lie_group_16': {
- 'eq': x*diff(f(x),x) - f(x) - x/log(x),
- 'sol': [Eq(f(x), x*(C1 + log(log(x))))],
- },
- 'lie_group_17': {
- 'eq': (f(x).diff(x)-f(x)) * (f(x).diff(x)+f(x)),
- 'sol': [Eq(f(x), C1*exp(x)), Eq(f(x), C1*exp(-x))],
- },
- 'lie_group_18': {
- 'eq': f(x).diff(x) * (f(x).diff(x) - f(x)),
- 'sol': [Eq(f(x), C1*exp(x)), Eq(f(x), C1)],
- },
- 'lie_group_19': {
- 'eq': (f(x).diff(x)-f(x)) * (f(x).diff(x)+f(x)),
- 'sol': [Eq(f(x), C1*exp(-x)), Eq(f(x), C1*exp(x))],
- },
- 'lie_group_20': {
- 'eq': f(x).diff(x)*(f(x).diff(x)+f(x)),
- 'sol': [Eq(f(x), C1), Eq(f(x), C1*exp(-x))],
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_2nd_linear_airy():
- return {
- 'hint': "2nd_linear_airy",
- 'func': f(x),
- 'examples':{
- '2nd_lin_airy_01': {
- 'eq': f(x).diff(x, 2) - x*f(x),
- 'sol': [Eq(f(x), C1*airyai(x) + C2*airybi(x))],
- },
- '2nd_lin_airy_02': {
- 'eq': f(x).diff(x, 2) + 2*x*f(x),
- 'sol': [Eq(f(x), C1*airyai(-2**(S(1)/3)*x) + C2*airybi(-2**(S(1)/3)*x))],
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_nth_linear_constant_coeff_homogeneous():
- # From Exercise 20, in Ordinary Differential Equations,
- # Tenenbaum and Pollard, pg. 220
- a = Symbol('a', positive=True)
- k = Symbol('k', real=True)
- r1, r2, r3, r4, r5 = [rootof(x**5 + 11*x - 2, n) for n in range(5)]
- r6, r7, r8, r9, r10 = [rootof(x**5 - 3*x + 1, n) for n in range(5)]
- r11, r12, r13, r14, r15 = [rootof(x**5 - 100*x**3 + 1000*x + 1, n) for n in range(5)]
- r16, r17, r18, r19, r20 = [rootof(x**5 - x**4 + 10, n) for n in range(5)]
- r21, r22, r23, r24, r25 = [rootof(x**5 - x + 1, n) for n in range(5)]
- E = exp(1)
- return {
- 'hint': "nth_linear_constant_coeff_homogeneous",
- 'func': f(x),
- 'examples':{
- 'lin_const_coeff_hom_01': {
- 'eq': f(x).diff(x, 2) + 2*f(x).diff(x),
- 'sol': [Eq(f(x), C1 + C2*exp(-2*x))],
- },
- 'lin_const_coeff_hom_02': {
- 'eq': f(x).diff(x, 2) - 3*f(x).diff(x) + 2*f(x),
- 'sol': [Eq(f(x), (C1 + C2*exp(x))*exp(x))],
- },
- 'lin_const_coeff_hom_03': {
- 'eq': f(x).diff(x, 2) - f(x),
- 'sol': [Eq(f(x), C1*exp(-x) + C2*exp(x))],
- },
- 'lin_const_coeff_hom_04': {
- 'eq': f(x).diff(x, 3) + f(x).diff(x, 2) - 6*f(x).diff(x),
- 'sol': [Eq(f(x), C1 + C2*exp(-3*x) + C3*exp(2*x))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_05': {
- 'eq': 6*f(x).diff(x, 2) - 11*f(x).diff(x) + 4*f(x),
- 'sol': [Eq(f(x), C1*exp(x/2) + C2*exp(x*Rational(4, 3)))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_06': {
- 'eq': Eq(f(x).diff(x, 2) + 2*f(x).diff(x) - f(x), 0),
- 'sol': [Eq(f(x), C1*exp(x*(-1 + sqrt(2))) + C2*exp(-x*(sqrt(2) + 1)))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_07': {
- 'eq': diff(f(x), x, 3) + diff(f(x), x, 2) - 10*diff(f(x), x) - 6*f(x),
- 'sol': [Eq(f(x), C1*exp(3*x) + C3*exp(-x*(2 + sqrt(2))) + C2*exp(x*(-2 + sqrt(2))))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_08': {
- 'eq': f(x).diff(x, 4) - f(x).diff(x, 3) - 4*f(x).diff(x, 2) + \
- 4*f(x).diff(x),
- 'sol': [Eq(f(x), C1 + C2*exp(-2*x) + C3*exp(x) + C4*exp(2*x))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_09': {
- 'eq': f(x).diff(x, 4) + 4*f(x).diff(x, 3) + f(x).diff(x, 2) - \
- 4*f(x).diff(x) - 2*f(x),
- 'sol': [Eq(f(x), C3*exp(-x) + C4*exp(x) + (C1*exp(-sqrt(2)*x) + C2*exp(sqrt(2)*x))*exp(-2*x))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_10': {
- 'eq': f(x).diff(x, 4) - a**2*f(x),
- 'sol': [Eq(f(x), C1*exp(-sqrt(a)*x) + C2*exp(sqrt(a)*x) + C3*sin(sqrt(a)*x) + C4*cos(sqrt(a)*x))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_11': {
- 'eq': f(x).diff(x, 2) - 2*k*f(x).diff(x) - 2*f(x),
- 'sol': [Eq(f(x), C1*exp(x*(k - sqrt(k**2 + 2))) + C2*exp(x*(k + sqrt(k**2 + 2))))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_12': {
- 'eq': f(x).diff(x, 2) + 4*k*f(x).diff(x) - 12*k**2*f(x),
- 'sol': [Eq(f(x), C1*exp(-6*k*x) + C2*exp(2*k*x))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_13': {
- 'eq': f(x).diff(x, 4),
- 'sol': [Eq(f(x), C1 + C2*x + C3*x**2 + C4*x**3)],
- 'slow': True,
- },
- 'lin_const_coeff_hom_14': {
- 'eq': f(x).diff(x, 2) + 4*f(x).diff(x) + 4*f(x),
- 'sol': [Eq(f(x), (C1 + C2*x)*exp(-2*x))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_15': {
- 'eq': 3*f(x).diff(x, 3) + 5*f(x).diff(x, 2) + f(x).diff(x) - f(x),
- 'sol': [Eq(f(x), (C1 + C2*x)*exp(-x) + C3*exp(x/3))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_16': {
- 'eq': f(x).diff(x, 3) - 6*f(x).diff(x, 2) + 12*f(x).diff(x) - 8*f(x),
- 'sol': [Eq(f(x), (C1 + x*(C2 + C3*x))*exp(2*x))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_17': {
- 'eq': f(x).diff(x, 2) - 2*a*f(x).diff(x) + a**2*f(x),
- 'sol': [Eq(f(x), (C1 + C2*x)*exp(a*x))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_18': {
- 'eq': f(x).diff(x, 4) + 3*f(x).diff(x, 3),
- 'sol': [Eq(f(x), C1 + C2*x + C3*x**2 + C4*exp(-3*x))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_19': {
- 'eq': f(x).diff(x, 4) - 2*f(x).diff(x, 2),
- 'sol': [Eq(f(x), C1 + C2*x + C3*exp(-sqrt(2)*x) + C4*exp(sqrt(2)*x))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_20': {
- 'eq': f(x).diff(x, 4) + 2*f(x).diff(x, 3) - 11*f(x).diff(x, 2) - \
- 12*f(x).diff(x) + 36*f(x),
- 'sol': [Eq(f(x), (C1 + C2*x)*exp(-3*x) + (C3 + C4*x)*exp(2*x))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_21': {
- 'eq': 36*f(x).diff(x, 4) - 37*f(x).diff(x, 2) + 4*f(x).diff(x) + 5*f(x),
- 'sol': [Eq(f(x), C1*exp(-x) + C2*exp(-x/3) + C3*exp(x/2) + C4*exp(x*Rational(5, 6)))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_22': {
- 'eq': f(x).diff(x, 4) - 8*f(x).diff(x, 2) + 16*f(x),
- 'sol': [Eq(f(x), (C1 + C2*x)*exp(-2*x) + (C3 + C4*x)*exp(2*x))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_23': {
- 'eq': f(x).diff(x, 2) - 2*f(x).diff(x) + 5*f(x),
- 'sol': [Eq(f(x), (C1*sin(2*x) + C2*cos(2*x))*exp(x))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_24': {
- 'eq': f(x).diff(x, 2) - f(x).diff(x) + f(x),
- 'sol': [Eq(f(x), (C1*sin(x*sqrt(3)/2) + C2*cos(x*sqrt(3)/2))*exp(x/2))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_25': {
- 'eq': f(x).diff(x, 4) + 5*f(x).diff(x, 2) + 6*f(x),
- 'sol': [Eq(f(x),
- C1*sin(sqrt(2)*x) + C2*sin(sqrt(3)*x) + C3*cos(sqrt(2)*x) + C4*cos(sqrt(3)*x))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_26': {
- 'eq': f(x).diff(x, 2) - 4*f(x).diff(x) + 20*f(x),
- 'sol': [Eq(f(x), (C1*sin(4*x) + C2*cos(4*x))*exp(2*x))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_27': {
- 'eq': f(x).diff(x, 4) + 4*f(x).diff(x, 2) + 4*f(x),
- 'sol': [Eq(f(x), (C1 + C2*x)*sin(x*sqrt(2)) + (C3 + C4*x)*cos(x*sqrt(2)))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_28': {
- 'eq': f(x).diff(x, 3) + 8*f(x),
- 'sol': [Eq(f(x), (C1*sin(x*sqrt(3)) + C2*cos(x*sqrt(3)))*exp(x) + C3*exp(-2*x))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_29': {
- 'eq': f(x).diff(x, 4) + 4*f(x).diff(x, 2),
- 'sol': [Eq(f(x), C1 + C2*x + C3*sin(2*x) + C4*cos(2*x))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_30': {
- 'eq': f(x).diff(x, 5) + 2*f(x).diff(x, 3) + f(x).diff(x),
- 'sol': [Eq(f(x), C1 + (C2 + C3*x)*sin(x) + (C4 + C5*x)*cos(x))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_31': {
- 'eq': f(x).diff(x, 4) + f(x).diff(x, 2) + f(x),
- 'sol': [Eq(f(x), (C1*sin(sqrt(3)*x/2) + C2*cos(sqrt(3)*x/2))*exp(-x/2)
- + (C3*sin(sqrt(3)*x/2) + C4*cos(sqrt(3)*x/2))*exp(x/2))],
- 'slow': True,
- },
- 'lin_const_coeff_hom_32': {
- 'eq': f(x).diff(x, 4) + 4*f(x).diff(x, 2) + f(x),
- 'sol': [Eq(f(x), C1*sin(x*sqrt(-sqrt(3) + 2)) + C2*sin(x*sqrt(sqrt(3) + 2))
- + C3*cos(x*sqrt(-sqrt(3) + 2)) + C4*cos(x*sqrt(sqrt(3) + 2)))],
- 'slow': True,
- },
- # One real root, two complex conjugate pairs
- 'lin_const_coeff_hom_33': {
- 'eq': f(x).diff(x, 5) + 11*f(x).diff(x) - 2*f(x),
- 'sol': [Eq(f(x),
- C5*exp(r1*x) + exp(re(r2)*x) * (C1*sin(im(r2)*x) + C2*cos(im(r2)*x))
- + exp(re(r4)*x) * (C3*sin(im(r4)*x) + C4*cos(im(r4)*x)))],
- 'checkodesol_XFAIL':True, #It Hangs
- },
- # Three real roots, one complex conjugate pair
- 'lin_const_coeff_hom_34': {
- 'eq': f(x).diff(x,5) - 3*f(x).diff(x) + f(x),
- 'sol': [Eq(f(x),
- C3*exp(r6*x) + C4*exp(r7*x) + C5*exp(r8*x)
- + exp(re(r9)*x) * (C1*sin(im(r9)*x) + C2*cos(im(r9)*x)))],
- 'checkodesol_XFAIL':True, #It Hangs
- },
- # Five distinct real roots
- 'lin_const_coeff_hom_35': {
- 'eq': f(x).diff(x,5) - 100*f(x).diff(x,3) + 1000*f(x).diff(x) + f(x),
- 'sol': [Eq(f(x), C1*exp(r11*x) + C2*exp(r12*x) + C3*exp(r13*x) + C4*exp(r14*x) + C5*exp(r15*x))],
- 'checkodesol_XFAIL':True, #It Hangs
- },
- # Rational root and unsolvable quintic
- 'lin_const_coeff_hom_36': {
- 'eq': f(x).diff(x, 6) - 6*f(x).diff(x, 5) + 5*f(x).diff(x, 4) + 10*f(x).diff(x) - 50 * f(x),
- 'sol': [Eq(f(x),
- C5*exp(5*x)
- + C6*exp(x*r16)
- + exp(re(r17)*x) * (C1*sin(im(r17)*x) + C2*cos(im(r17)*x))
- + exp(re(r19)*x) * (C3*sin(im(r19)*x) + C4*cos(im(r19)*x)))],
- 'checkodesol_XFAIL':True, #It Hangs
- },
- # Five double roots (this is (x**5 - x + 1)**2)
- 'lin_const_coeff_hom_37': {
- 'eq': f(x).diff(x, 10) - 2*f(x).diff(x, 6) + 2*f(x).diff(x, 5)
- + f(x).diff(x, 2) - 2*f(x).diff(x, 1) + f(x),
- 'sol': [Eq(f(x), (C1 + C2*x)*exp(x*r21) + (-((C3 + C4*x)*sin(x*im(r22)))
- + (C5 + C6*x)*cos(x*im(r22)))*exp(x*re(r22)) + (-((C7 + C8*x)*sin(x*im(r24)))
- + (C10*x + C9)*cos(x*im(r24)))*exp(x*re(r24)))],
- 'checkodesol_XFAIL':True, #It Hangs
- },
- 'lin_const_coeff_hom_38': {
- 'eq': Eq(sqrt(2) * f(x).diff(x,x,x) + f(x).diff(x), 0),
- 'sol': [Eq(f(x), C1 + C2*sin(2**Rational(3, 4)*x/2) + C3*cos(2**Rational(3, 4)*x/2))],
- },
- 'lin_const_coeff_hom_39': {
- 'eq': Eq(E * f(x).diff(x,x,x) + f(x).diff(x), 0),
- 'sol': [Eq(f(x), C1 + C2*sin(x/sqrt(E)) + C3*cos(x/sqrt(E)))],
- },
- 'lin_const_coeff_hom_40': {
- 'eq': Eq(pi * f(x).diff(x,x,x) + f(x).diff(x), 0),
- 'sol': [Eq(f(x), C1 + C2*sin(x/sqrt(pi)) + C3*cos(x/sqrt(pi)))],
- },
- 'lin_const_coeff_hom_41': {
- 'eq': Eq(I * f(x).diff(x,x,x) + f(x).diff(x), 0),
- 'sol': [Eq(f(x), C1 + C2*exp(-sqrt(I)*x) + C3*exp(sqrt(I)*x))],
- },
- 'lin_const_coeff_hom_42': {
- 'eq': f(x).diff(x, x) + y*f(x),
- 'sol': [Eq(f(x), C1*exp(-x*sqrt(-y)) + C2*exp(x*sqrt(-y)))],
- },
- 'lin_const_coeff_hom_43': {
- 'eq': Eq(9*f(x).diff(x, x) + f(x), 0),
- 'sol': [Eq(f(x), C1*sin(x/3) + C2*cos(x/3))],
- },
- 'lin_const_coeff_hom_44': {
- 'eq': Eq(9*f(x).diff(x, x), f(x)),
- 'sol': [Eq(f(x), C1*exp(-x/3) + C2*exp(x/3))],
- },
- 'lin_const_coeff_hom_45': {
- 'eq': Eq(f(x).diff(x, x) - 3*diff(f(x), x) + 2*f(x), 0),
- 'sol': [Eq(f(x), (C1 + C2*exp(x))*exp(x))],
- },
- 'lin_const_coeff_hom_46': {
- 'eq': Eq(f(x).diff(x, x) - 4*diff(f(x), x) + 4*f(x), 0),
- 'sol': [Eq(f(x), (C1 + C2*x)*exp(2*x))],
- },
- # Type: 2nd order, constant coefficients (two real equal roots)
- 'lin_const_coeff_hom_47': {
- 'eq': Eq(f(x).diff(x, x) + 2*diff(f(x), x) + 3*f(x), 0),
- 'sol': [Eq(f(x), (C1*sin(x*sqrt(2)) + C2*cos(x*sqrt(2)))*exp(-x))],
- },
- #These were from issue: https://github.com/sympy/sympy/issues/6247
- 'lin_const_coeff_hom_48': {
- 'eq': f(x).diff(x, x) + 4*f(x),
- 'sol': [Eq(f(x), C1*sin(2*x) + C2*cos(2*x))],
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_1st_homogeneous_coeff_subs_dep_div_indep():
- return {
- 'hint': "1st_homogeneous_coeff_subs_dep_div_indep",
- 'func': f(x),
- 'examples':{
- 'dep_div_indep_01': {
- 'eq': f(x)/x*cos(f(x)/x) - (x/f(x)*sin(f(x)/x) + cos(f(x)/x))*f(x).diff(x),
- 'sol': [Eq(log(x), C1 - log(f(x)*sin(f(x)/x)/x))],
- 'slow': True
- },
- #indep_div_dep actually has a simpler solution for example 2 but it runs too slow.
- 'dep_div_indep_02': {
- 'eq': x*f(x).diff(x) - f(x) - x*sin(f(x)/x),
- 'sol': [Eq(log(x), log(C1) + log(cos(f(x)/x) - 1)/2 - log(cos(f(x)/x) + 1)/2)],
- 'simplify_flag':False,
- },
- 'dep_div_indep_03': {
- 'eq': x*exp(f(x)/x) - f(x)*sin(f(x)/x) + x*sin(f(x)/x)*f(x).diff(x),
- 'sol': [Eq(log(x), C1 + exp(-f(x)/x)*sin(f(x)/x)/2 + exp(-f(x)/x)*cos(f(x)/x)/2)],
- 'slow': True
- },
- 'dep_div_indep_04': {
- 'eq': f(x).diff(x) - f(x)/x + 1/sin(f(x)/x),
- 'sol': [Eq(f(x), x*(-acos(C1 + log(x)) + 2*pi)), Eq(f(x), x*acos(C1 + log(x)))],
- 'slow': True
- },
- # previous code was testing with these other solution:
- # example5_solb = Eq(f(x), log(log(C1/x)**(-x)))
- 'dep_div_indep_05': {
- 'eq': x*exp(f(x)/x) + f(x) - x*f(x).diff(x),
- 'sol': [Eq(f(x), log((1/(C1 - log(x)))**x))],
- 'checkodesol_XFAIL':True, #(because of **x?)
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_linear_coefficients():
- return {
- 'hint': "linear_coefficients",
- 'func': f(x),
- 'examples':{
- 'linear_coeff_01': {
- 'eq': f(x).diff(x) + (3 + 2*f(x))/(x + 3),
- 'sol': [Eq(f(x), C1/(x**2 + 6*x + 9) - Rational(3, 2))],
- },
- }
- }
- @_add_example_keys
- def _get_examples_ode_sol_1st_homogeneous_coeff_best():
- return {
- 'hint': "1st_homogeneous_coeff_best",
- 'func': f(x),
- 'examples':{
- # previous code was testing this with other solution:
- # example1_solb = Eq(-f(x)/(1 + log(x/f(x))), C1)
- '1st_homogeneous_coeff_best_01': {
- 'eq': f(x) + (x*log(f(x)/x) - 2*x)*diff(f(x), x),
- 'sol': [Eq(f(x), -exp(C1)*LambertW(-x*exp(-C1 + 1)))],
- 'checkodesol_XFAIL':True, #(because of LambertW?)
- },
- '1st_homogeneous_coeff_best_02': {
- 'eq': 2*f(x)*exp(x/f(x)) + f(x)*f(x).diff(x) - 2*x*exp(x/f(x))*f(x).diff(x),
- 'sol': [Eq(log(f(x)), C1 - 2*exp(x/f(x)))],
- },
- # previous code was testing this with other solution:
- # example3_solb = Eq(log(C1*x*sqrt(1/x)*sqrt(f(x))) + x**2/(2*f(x)**2), 0)
- '1st_homogeneous_coeff_best_03': {
- 'eq': 2*x**2*f(x) + f(x)**3 + (x*f(x)**2 - 2*x**3)*f(x).diff(x),
- 'sol': [Eq(f(x), exp(2*C1 + LambertW(-2*x**4*exp(-4*C1))/2)/x)],
- 'checkodesol_XFAIL':True, #(because of LambertW?)
- },
- '1st_homogeneous_coeff_best_04': {
- 'eq': (x + sqrt(f(x)**2 - x*f(x)))*f(x).diff(x) - f(x),
- 'sol': [Eq(log(f(x)), C1 - 2*sqrt(-x/f(x) + 1))],
- 'slow': True,
- },
- '1st_homogeneous_coeff_best_05': {
- 'eq': x + f(x) - (x - f(x))*f(x).diff(x),
- 'sol': [Eq(log(x), C1 - log(sqrt(1 + f(x)**2/x**2)) + atan(f(x)/x))],
- },
- '1st_homogeneous_coeff_best_06': {
- 'eq': x*f(x).diff(x) - f(x) - x*sin(f(x)/x),
- 'sol': [Eq(f(x), 2*x*atan(C1*x))],
- },
- '1st_homogeneous_coeff_best_07': {
- 'eq': x**2 + f(x)**2 - 2*x*f(x)*f(x).diff(x),
- 'sol': [Eq(f(x), -sqrt(x*(C1 + x))), Eq(f(x), sqrt(x*(C1 + x)))],
- },
- '1st_homogeneous_coeff_best_08': {
- 'eq': f(x)**2 + (x*sqrt(f(x)**2 - x**2) - x*f(x))*f(x).diff(x),
- 'sol': [Eq(f(x), -sqrt(-x*exp(2*C1)/(x - 2*exp(C1)))), Eq(f(x), sqrt(-x*exp(2*C1)/(x - 2*exp(C1))))],
- 'checkodesol_XFAIL': True # solutions are valid in a range
- },
- }
- }
- def _get_all_examples():
- all_examples = _get_examples_ode_sol_euler_homogeneous + \
- _get_examples_ode_sol_euler_undetermined_coeff + \
- _get_examples_ode_sol_euler_var_para + \
- _get_examples_ode_sol_factorable + \
- _get_examples_ode_sol_bernoulli + \
- _get_examples_ode_sol_nth_algebraic + \
- _get_examples_ode_sol_riccati + \
- _get_examples_ode_sol_1st_linear + \
- _get_examples_ode_sol_1st_exact + \
- _get_examples_ode_sol_almost_linear + \
- _get_examples_ode_sol_nth_order_reducible + \
- _get_examples_ode_sol_nth_linear_undetermined_coefficients + \
- _get_examples_ode_sol_liouville + \
- _get_examples_ode_sol_separable + \
- _get_examples_ode_sol_1st_rational_riccati + \
- _get_examples_ode_sol_nth_linear_var_of_parameters + \
- _get_examples_ode_sol_2nd_linear_bessel + \
- _get_examples_ode_sol_2nd_2F1_hypergeometric + \
- _get_examples_ode_sol_2nd_nonlinear_autonomous_conserved + \
- _get_examples_ode_sol_separable_reduced + \
- _get_examples_ode_sol_lie_group + \
- _get_examples_ode_sol_2nd_linear_airy + \
- _get_examples_ode_sol_nth_linear_constant_coeff_homogeneous +\
- _get_examples_ode_sol_1st_homogeneous_coeff_best +\
- _get_examples_ode_sol_1st_homogeneous_coeff_subs_dep_div_indep +\
- _get_examples_ode_sol_linear_coefficients
- return all_examples
|