• Register

Simbolično parcialno odvajanje enačbe

+6 votes
610 views

Pozdravljeni,

Spodnjo enačbo 

bi rad parcialno odvajal po njenih koeficientih

in iz njih oblikoval matriko ter tako prišel do sistema linearnih enačb. V ta namen sem se poslužil uporabe sympy modula in funkcije diff().

Problem nastopi, ko želim enačbo odvajati po produktih (T_a*a_0, T_a*a_1, T_a*a_2) in se izpiše error:

ValueError: 
Can't calculate 1-th derivative wrt T_a*a_0.

Sam sem sicer to rešil tako, da sem produkte z funkcijo subs()  z koeficienti (npr. subs(T_a*a_0, Taa_0)), vendar končni rezultat ni pravilen.

Zanima me, kako bi to lahko rešil tako, da substitucija ne bi bila potrebna in bi zadeva pravilno delovala.

P.S.

Celotni opis problema skupaj z kodo je dostopen TUKAJ, saj ga na tej strani zaradi omejitve 8000 znakov nisem mogel objaviti.

LP in hvala za kakršno koli pomoč.

asked May 10, 2016 by tonc (690 points)
Nekaj na to temo je v sympy dokumentaciji:
http://docs.sympy.org/latest/modules/core.html#sympy.core.function.Derivative

Upam, da vam kaj pomaga.
Ste prepričani, da je vaš problem matematično pravilno definiran?
@Blaz; Hvala, si bom pogledal še enkrat, čeprav sem čez sympy dokumentacijo že šel čez, vendar sem mogoče spregledal kakšen detajl.

@Janko; Matematični problem izhaja direktno iz znanstvenega članka, tako da bi matematično gledano moral biti pravilno opredeljen, drugo vprašanje pa je, kako ga spraviti v korektno numerično obliko... Sem še začetnik v pythonu zato nisem seznanjen z vsemi opcijami, ki jih python ponuja, vendar se mi dozdeva, da ne gre za tako redek matematični problem...

1 Answer

+4 votes
 
Best answer

Po še enkratnem prebiranju dokumentacije, ki jo je poslal Blaž, sem ugotovil v čem je problem. Torej glavno vprašanje je bilo, kako simbolično odvajati funkcijo z drugo funkcijo. Izkaže se, da je v ta namen potrebno spremeniti lastnosti funkcije, s katero bomo odvajali našo glavno funkcijo, npr:

x, y, z = symbols('x, y, z')
A = x*y*z
B = x*y

# To je ta detajl, ki sem ga prej spregledal:
type(B)._diff_wrt = True
diff(A, B)
Upam, da bo to pomagalo še komu, ki se v prihodnosti znajde v podobni dilemi. 
Hvala za vašo pomoč in čas. LP
answered May 11, 2016 by tonc (690 points)
selected May 11, 2016 by tonc
...