• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

pochodne C++

0 głosów
117 wizyt
pytanie zadane 22 czerwca w C i C++ przez der4 Nowicjusz (120 p.)

Witam

Doradzi ktoś dlaczego wynik wychodzi mi zły...indecision

#include <iostream>
#include <math.h>
#include <cmath>
// Pochodne!
using namespace std;
double f(double x)
{
   return sin(x);
}

int main()
{

  double x=0, h=0.01;
  cout<<"podaj X:";
  cin>>x;
  double RSC = (f(x+h)-f(x-h))/(2*h);
  cout<<"Metoda RSC"<<endl;
  cout << "f'(" << x << ") = " << RSC<< endl;
  double RSP = (f(x+h)-f(x))/(h);
  cout<<"Metoda RSP"<<endl;
  cout << "f'(" << x << ") = " << RSP << endl;
  double RST = (f(x)-f(x-h))/(h);
  cout<<"Metoda RST"<<endl;
  cout << "f'(" << x << ") = " << RST << endl;
//return 0;
}

 

1
komentarz 22 czerwca przez Oscar Nałogowiec (26,110 p.)
A konkretnie co jest błędne? Pamiętaj, że kąty są w radianach.

Trochę dziwnie inkludujesz oba podobne nagłówki - math.h to nagłówek dla C, cmath dla C++ (namespace itp), ale funkcje mają takie same.
komentarz 22 czerwca przez der4 Nowicjusz (120 p.)
f^' (1)=((1+0.01)-(1-0.01))/0.02 = 1 
sin(x)= 0.017452 

 

wydaj mi się że taki wynik powinien być.

1
komentarz 22 czerwca przez adrian17 Ekspert (320,820 p.)
Uh, ta ostatnia wiadomość wiele sensu nie ma? Ogólnie nie wiem co chciałeś w tej pierwszej linii napisać.

Na moje oko to wyniki z odpalenia Twojego kodu wyglądają poprawnie.
2
komentarz 22 czerwca przez Kartoszka Obywatel (1,220 p.)

Program liczy okej, pamiętaj że używasz przybliżeń różnicowych - przybliżenia są obarczone błędem.

Wyniki po wklejeniu kodu u mnie:

Metoda RSC: sin'(1) = 0.540293
Metoda RSP: sin'(1) = 0.536086
Metoda RST: sin'(1) = 0.544501
Pochodna dokładna sin'(1) = 0.540302


Nie wiem tez jak ci wyszedł "sin(x) = 0.017452", co podstawiłeś za x?

f^' (1)=((1+0.01)-(1-0.01))/0.02 = 1 oraz to, też nie jest zrozumiałe "f^'"? Pochodna z f? zapis sugeruje że pochodna z f w jedynce równa się temu co jest znaku równości, ale jest to wzór na różnicę centralną, tyle że z pominiętym f przed nawiasami z (1+0.01) i (1-0.01).

1 odpowiedź

+1 głos
odpowiedź 22 czerwca przez Kartoszka Obywatel (1,220 p.)
edycja 22 czerwca przez Kartoszka

Napisałem szybki programik

#include <iostream>
#include <math.h>
#include <fstream>

using namespace std;

double f(double x){
   return sin(x);
}
 
double f_d(double x){
    return cos(x);
}

double central(double x, double h){
    return (f(x+h) - f(x-h)) / h * 0.5;
}

int main(){

    double a = 0.0;
    double b = 2.0 * M_PI;
    double h = 0.01;

    ofstream file;
    file.open("result.txt");

    for (double x = a; x <= b; x += h)
        file << x << ", " << f_d(x) << ", " << central(x, h) << "\n";
    
    file.close();
    return 0;
}

wraz z gnuplotem

set term png
set output "result.png"
set xlabel "x"
set ylabel "sin'(x) = cos(x)"
set autoscale
plot "result.txt" using 1:2 w l lw 6 title "cos(x)", \
    "result.txt" using 1:3 pt 7 ps 0.4 title "central"

Co nam daje wykres różnicy centralnej oraz dokładnego rozwiązania:

Wykresy pokrywają się, ale oczywiście jest błąd, którego gołym okiem nie widać.

1
komentarz 22 czerwca przez Kartoszka Obywatel (1,220 p.)

Dopisałem jeszcze kawałek, aby pokazać błąd bezwzględny przybliżenia, co dało wykres (błąd na osi X wciąż nie jest równy zeru, ma rząd 10^(-8)):

Podobne pytania

+1 głos
1 odpowiedź 2,942 wizyt
0 głosów
3 odpowiedzi 164 wizyt
pytanie zadane 24 maja 2018 w C i C++ przez merlin84265 Nowicjusz (160 p.)

88,400 zapytań

137,011 odpowiedzi

305,796 komentarzy

58,656 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...