Mam równanie
y = a + b Exp[-x/c] data = {{462.36, 8872}, {408.18, 8780}, {374.4, 8915}, {322.8, 8937}, {274.00, 8919}, {243.03, 9114}, {209.32, 9277}, {178.91, 9394}, {140.71, 9508}, {113.08, 9592}}; nlm = FindFit[data, y = a + b Exp[-x/c], {{a, 100}, {b, 100}, {c, 10}}, x] Show[ ListPlot[data, PlotStyle -> {Darker@Green, PointSize[0.03]}], Plot[y/. nlm, {x, 1, 600}]]
Powyższe pokazuje, jak obecnie wszystko działa i wykresów.
Aktualizacja
Właściwie mam prawie wszystko działające Mam theline bieing drwan jedyny problem jaki mam to to, że pierwsze 2 punkty danych i początek linii rysowany w rzeczywistości zaczyna się przed osią y na wykresie, więc jeśli spojrzysz na wykres, jest on przekrzywiony w lewo. Próbuję zrozumieć, jaką wartość będę musiał zmienić, aby przesunąć to z powrotem w prawo i trochę się z tym zmagam. każda pomoc będzie mile widziana.
jak mogę to wpisać w funkcji FindFit
?
FindFit[data, model, parms];
Mam swoje dane, po prostu nie mogę po prostu „dowiedzieć się, jak poprawnie umieścić je w model
i params
. To jest eqostrożność, którą otrzymałem w związku z danymi i po prostu nie wiem, jak je wprowadzić ani pokazać, że będzie to krzywa wykładnicza.
Komentarze
- OK, oto moje pytanie i ' wszystko działa przez większość czasu. jedyną rzeczą, z którą mam problem, jest to, że oś X zaczyna się od 150, a mój pierwszy punkt to 113. widzisz problem, kreśli się za osią y. Czy jest więc sposób na zainicjowanie osi X.
- Twoje zaktualizowane pytanie dotyczy tylko ustawienia zakresu wykresu. W tym przypadku ręczne ustawienie działa najlepiej, umieść PlotRange – > {{0, 800}, {8000, 11000}} wewnątrz ListPlot.
Odpowiedź
Lepiej jest użyć NonlinearModelFit
:
data = {{0, 10}, {1, 5}, {3, 2}, {5, 1}, {6, 0}, {7, 0}}; nlm = NonlinearModelFit[data, a + b Exp[-x/c], {a, b, c}, x] Show[Plot[nlm[x], {x, 0, 7}] ,ListPlot[data, PlotStyle -> {Darker@Green, PointSize[0.03]}] ]
Aby zobaczyć parametry, użyj nlm["BestFitParameters"]
aby uzyskać
{a-> 0.100889, b-> 9.76356, c-> 1.62293}
Aktualizacja
Korzystając z nowych danych testowych z @ george2079 wskazówką, którą otrzymujesz:
data = {{462.36,8872},{408.18,8780},{374.4,8915},{322.8,8937}, {274.00,8919},{243.03,9114},{209.32,9277},{178.91,9394}, {140.71,9508},{113.08,9592}}; nlm=NonlinearModelFit[data, a + b Exp[-x /c], {{a, 100}, {b, 100}, {c, 10}},x] Show[ListPlot[data, PlotStyle -> {Darker@Green, PointSize[0.03]}] ,Plot[nlm[x],{x,1,600}] ]
Komentarze
- Mam problem z wyświetleniem NieliniowegoModelfita, ponieważ powoduje to błędy składniowe. Myślę, że w ListPlot jest coś, co mu się nie podoba.
- Możesz dołączyć kilka przykładowych danych do swojego pytania, abyśmy mogli je przetestować.
- @Bill edytuj swoje pytanie. z usi ng komentarzy.
- Dodałem dane i funkcje, których próbuję użyć do mojego pierwotnego pytania. wszelkie sugestie będą bardzo mile widziane.
- To działa świetnie. jedyny problem, jaki mam, to pokazanie linii. Otrzymuję dane do wykreślenia, ale nie ' nie otrzymuję krzywej do wykreślenia. jakieś pojęcie, co robię źle.
Odpowiedź
W tym przypadku FindFit i NonlinearModelFit nie znajdują dobre dopasowanie, musisz podać rozsądne wartości początkowe parametrów:
data = {{462.36, 8872}, {408.18, 8780}, {374.4, 8915}, {322.8, 8937}, {274.00, 8919}, {243.03, 9114}, {209.32, 9277}, {178.91, 9394}, {140.71, 9508}, {113.08, 9592}} FindFit[data, a + b Exp[-x /c], {a, b, c}, x]
(* błąd Wielkość kroku w wyszukiwaniu stała się mniejsza niż tolerancja. .. *)
FindFit[data, a + b Exp[-x /c], {{a, 100}, {b, 100}, {c, 10}}, x]
(* {a -> 8692.35, b -> 1910.19, c -> 161,513} *)
To dobrze wyglądające dopasowanie, przepraszam, że nie mogę publikować grafiki.
Jak więc wymyślić wartości początkowe? Wykreśliłem wyrażenie i bawiłem się stałymi ręcznie, aż doszedłem całkiem blisko. Przepraszam, jeśli to niezadowalające, ale naprawdę jest trochę sztuki dopasowywania danych, która wykracza poza możliwości matematyki w sposób w pełni automatyczny.
Komentarze
- Mam linię do wykresu z Twoim kodem, ale nadal otrzymuję przekrzywiony wykres. wszelkie pomysły.