Obliczanie wartosci pochodnej funkcji.

0

Witam, od wczoraj zastanawiam sie jak napisac program ktory bedzie obliczal wartosc pochodnej fukncji podanej na wejsciu. Moze ktos juz pisal taki program, lub wie jak to zrobic?

Przy liczeniu pochodnej dla punktu, powinienem chyba skorzystac z definicji granicy. W bibliotekach math w javie lub c jest takowa definicja?

Przy liczeniu pochodnej ogolnie, tzn np na wejsciu podaje funkcje x2 + x3 na wyjsciu powinienem dostac 2x + 3x2. Moj jedyny pomysł, jak na razie, to w programie analizowac linie wprowdzona na wejsciu, oraz wyselekcjonowac z niej konkretne "czesci" ktore moge podstawic pod tablice wartosci pochodnych (np xn = n*x^(n-1)). i na tej podstawie obliczac kolejne "czesci" funkcji wyjsciowej. Problem jednak moglby sie pojawic przy bardziej zlozonych funkcjach, trzeba by bylo uwzlegnic wystepowanie nawiasow itd.

Główne pytanie czy to dobra mysl na wykonanie tego programu, czy moze jest juz jakas biblioteka pozwalajaca wyliczac pochodna z funkcji ?

Wiem ze jest takie cos jak diff() w matlabie, ale czy jest takie cos w javie lub jezyku c?

0

Chcesz otrzymać wartości funkcji pochodnej czy jej wzór?

0

wzor, tak jak napisalem w przykladzie, np z f(x) = x^2 + x otrzymuje d(f(x),x)= 2x + 1

0

W takim razie zbuduj drzewo wyrażenia algebraicznego i korzystając z własności pochodnej wyznacz nowy wzór.
Np jeśli elementem drzewa będzie suma (dodawanie) to pochodną takiego dodawania jest suma pochodnych argumentów, czyli poddrzew tego dodawania. Następnym etapem może być uproszczenie wzoru czyli grupowanie potęg, skracanie ułamków itp, to będzie trudne, ale nie jest niezbędne.

0

wlasnie cos takiego mialem na mysli piszac o analizowaniu funkcji wejsciowej. Czyli nie mam dostepnej zadnej biblioteki ktora mi bedzie obliczala wzor pochodnej funkcji?

0

Może lepiej zastanów się nad zmianą podejścia.
Na ile dobrze zrozumiałem to przyjmujesz tylko i wyłącznie funkcję w postaci:
A(n)xn+...+A(3)x3+A(2)x2+A(1)x1+A(0)x0
więc wystarczy że użytkownik poda tablicę wspólczynników A(0)...A(n)
przy takim podejściu zadanie jest prymitywne jak konstrukcja bata.
Natomiast jeżeli chcesz aby użytkownik mógł wprowadzać wiersz w postaci: x2 + x3
to masz przerąbane bo użytkownik może zapisać dokładnie to samo również tak: x*(2+2*x5/(x4))*x/2
A w tym przypadku albo zwariujesz licząc pochodną albo będziesz musiał zrealizować otwieranie nawiasów skracanie i takie tam.

0
_13th_Dragon napisał(a):

A w tym przypadku albo zwariujesz licząc pochodną albo będziesz musiał zrealizować otwieranie nawiasów skracanie i takie tam.
Wcale nie zwariuje.

Pochodną liczy się banalnie. Wzory są proste. Przerąbane by miał, gdyby to było całkowanie ;) . A kwestia nawiasów i "takich tam" - są od tego gotowce (Shunting-yard itp).

0

To policz pochodną sin2(f(x)) + |x|*sign(x)*cos2(f(x))/x, gdzie f(x) cholernie skomplikowane wyrażenie na pól strony i ma wyjść zero. Odpuszczam Ci podanie dziedziny dla pochodnej.

0
adf88 napisał(a):

Następnym etapem może być uproszczenie wzoru czyli grupowanie potęg, skracanie ułamków itp, to będzie trudne, ale nie jest niezbędne.

adf88 napisał(a)

Problem będzie tylko z uproszczeniem wyniku, ale to od bidy można sobie darować

0

W powyższym przykładzie upraszczania nie można sobie darować. Wynik na 8 stron papieru kancelaryjnego (kiedy pochodna wynosi 0) jest nie do przyjęcia.

0

Tak na prawdę to nie możemy mówić o racji twojej bądź mojej. Zależy to od celu jaki chcemy osiągnąć (do czego nam to potrzebne).

0

Wlasnie chodzi o to ze nie przyjmuje tylko funkcji w postaci xn + ...+ x1, tylko kazda dowolna funkcje. Podalem tylko taki przyklad, to moglo wprowadzic w blad. Wlasnie w mojej calej rozkmine pojawil sie problem z nawiasami i zlozonoscia obliczen w bardziej skomplikowanych funkcjach.

Wiec caly pomysl realizacji polega na rozbiciu funkcji wejsciowej na mniejsze różniczkowalne "kawalki" i z kazdego policzyc pochodna według wzorow. Nastepnie złożyc te kawalki i wypisac na wyjsciu.
Wadą tego rozwiazania jest wlasnie to ze musze "sam" napisac jak moj program ma sie zachowywac przy spotykaniu nawiasow, lub np iloczynu fukncji. Poradze sobie z realizacja tego problemu, jednak głóqnw pytanie to czy jest to najrozsadniejsze podejscie.

Czy nie ma jakiegos latwiejszego sposobu, podejscia do problemu?

0

Przecież podałem ci łatwiejszy sposób: Wczytuj tylko tablicę współczynników.

0

Po co się męczyć skoro są gotowce :)
http://www.aidaim.com/products/free_components/difr_spc.php

0

Proponowałem gotowca, ale nie spasił (chyba).

Natomiast co do wyznaczania dziedziny - dopóki poruszamy się w obszarze "zwykłych" funkcji różniczkowalnych będzie się to robić równie prosto jak liczyć pochodną. Jeśli mamy drzewko/stos wyrażenia to możemy obrobić każdy kawałeczek z osobna.

0

Chyba się mylisz, trzeba jeszcze umieć rozwiązywać nierówności. Jaka jest dziedzina dla log(x-cos(x))?

0

Nierówności? Nieee, trzeba skorzystać z własności danych funkcji (najczęściej z ciągłości i iniektywności danej funkcji) i operować na odcinkach dziedziny (wyniki sumować).

    [1. log]
       |
    [2. -]
    /    \
[3. x]   [4. cos]  
           \
          [5. x]
  1. ℝ -> ℝ
  2. ℝ -> <-1, 1>
  3. ℝ -> ℝ
  4. [ℝ, <-1, 1>] -> ℝ
  5. ℝ -> ℝ+

ad 1. 3. i 5. każdy odcinek A..B odwzorowywany jest na f(A)..f(B)
ad 4. Jeśli odcinek (A..B) dziedziny przechodzi przez jakiekolwiek 2npi to górną granicą jest 1. Jeśli nie to max(cos(A), cos(B)). Podobnie z dolną.

Generalnie chodzi mi o to, że każdy taki kawałeczek można obrobić z osobna przy pomocy niezbyt skomplikowanej matematyki.

0

Żeby wyznaczyć dziedzinę złożenia trzeba rozwiązywać nierówności i równania. W podanym przykładzie musisz rozwiązać nierówność x>cos(x).

0

Trochę mi się pokićkało i zrobiłem tylko przeciwdziedzinę. No i faktycznie pojawiają się problemy. Owszem, będziemy musieli rozwiązywać równania i nierówności (wspomniane przekształcanie przedziałów), ale dla każdego kawałeczka z osobna. Nie trzeba będzie rozwiązywać "trudnych" nierówności złożonych z kilku kawałeczków.

Problem będą stanowić funkcje okresowe. Będziemy musieli zbiory dziedzin/przeciwdziedzin reprezentować jako zwielokrotnione odcinki np. <a + nt, b+nt> (n - dowolna liczba całkowita, t - okres). I tu się pojawia problem z sumowaniem tych przedziałów i jak taką sumę reprezentować.

Natomiast dla funkcji nieokresowych będzie w miarę prosto bo wciąż wystarczy reprezentacja dziedziny jako skończony zbiór odcinków. Wtedy wystarczy, że dla każdej funkcji z osobna zdefiniujemy sobie przekształcenie od odcinak przeciwdziedziny do zbioru odcinków dziedziny. W szczególności dla bijekcji zazwyczaj będzie to
D(<A, B>) = <f-1(A), f-1(B)>
gdzie:
D - funkcja przekształcająca odcinek przeciwdziedziny na odcinek dziedziny
<A, B> - odcinek przeciwdziedziny
f - badana funkcja

Tak więc zwracam honor, nie będzie tak prosto w przypadku funkcji okresowych.

0
prawy napisał(a):

wzor, tak jak napisalem w przykladzie, np z f(x) = x^2 + x otrzymuje d(f(x),x)= 2x + 1

Oblicz pochodną metodą numeryczną
http://en.wikipedia.org/wiki/Numerical_differentiation

i zrób regresję nieliniową.
http://en.wikipedia.org/wiki/Nonlinear_regression

To nie będzie dokładne rozwiązanie, chociaż jakby do tego dołożyć programowanie genetyczne i "trochę" czasu CPU to dało by się.

1 użytkowników online, w tym zalogowanych: 0, gości: 1