• Register

Numerično odvajanje funkcije dveh spremenljivk

+4 votes
823 views

Zdravo,

pri projektu sem se srečal s težavo, kako odvajati funkcijo notranjega momenta. Čez most se zapelje tovornjak in zanima me pozicija tega, da bo obremenitev na most največja. Moment je tako funkcija dveh spremenljivk (pozicije tovornjaka in x, ki gre po polju).

Ne uspe pa mi priti do pravilne rešitve, namreč problem sem že obravnaval s sympyjem in vem kakšen rezultat naj bi dobil.

Hvala

asked Dec 24, 2017 by dr (170 points)
edited Dec 24, 2017 by dr

1 Answer

+3 votes
Pozdravljeni!  Naprej odvajate po eni spremenljivki, nato po drugi, rezultat bo dvorazsežen. Preverite najprej na preprosti funkciji, npr: x**2+ x*y + y**2.
answered Dec 25, 2017 by janko.slavic (81,340 points)
Hvala za odgovor, ravno to sem sicer naredil (od 81. do 83. celice), problem je bil v napačnem predznaku v funkciji.
Super. A ste uporabili `numpy.gradient`? Podpira namreč odvode v več dimenzijah. Če odgovorite na vaše vprašanje celostno in s primerom, bom vaš odgovor izbral za najboljšega in boste dobili točke.
Ne, napisal sem funkciji za izračun odvoda po 'x' in 'l'. Koda, ki sem jo uporabil v projektu je, kot sem že rekel, na sliki zgoraj v celicah 81 - 83, le pri funkciji za izračun odvoda po 'l' je narobe predznačen drugi 'h'.
Najprej sem definiral numerični polji za 'x' in 'l', pri čemer pri 'l_num' nisem definiral celega nosilca, ampak območje, kjer po razumevanju pričakujem maksimum, s tem sem zmanjšal število operacij. Nato pa napisal dve for zanki, pri čemer sem v dobljenem seznamu poiskal 'x' in 'l', pri katerima se pojavi minimum momenta (glede na to, da gre za numerično odvajanje, verjetno iskana vrednost odvoda ne bo natanko 0). Vrednost 'l_2' (na zgornji sliki sicer oznaka 'l_min') pa sem izračunal s pomočjo indeksa vrednosti v seznamu, pri katerem je minimum odvoda momenta, in koraka odvajanja.
Vaš pristop ni napačen, je pa preveč kompliciran in zamegli osnovno matematiko/idejo; koda je enostavno preobsežna. Poskusite narediti enostavno dvodimenzionalno polje (`x` in `y` v mojem primeru zgoraj), nato uporabite enostavno funkcijo gradient (ali svojo implementacijo - ki pa naj sledi centralni diferenčni shemi). Vse skupaj se lahko vektorizira v par vrsticah - vključno z iskanjem ekstrema.
...