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

pochodne C++

VPS Starter Arubacloud
0 głosów
229 wizyt
pytanie zadane 22 czerwca 2022 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 2022 przez Oscar Nałogowiec (29,290 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 2022 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 2022 przez adrian17 Ekspert (344,100 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 2022 przez Kartoszka Obywatel (1,260 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 2022 przez Kartoszka Obywatel (1,260 p.)
edycja 22 czerwca 2022 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 2022 przez Kartoszka Obywatel (1,260 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ź 3,452 wizyt
0 głosów
3 odpowiedzi 304 wizyt
pytanie zadane 24 maja 2018 w C i C++ przez merlin84265 Nowicjusz (160 p.)

92,452 zapytań

141,262 odpowiedzi

319,080 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...