[C++] runge kutty felberg — błąd kompilacji

athame
Użytkownik
Użytkownik
Posty: 576
Rejestracja: 2 lut 2012, o 21:42
Płeć: Mężczyzna
Lokalizacja: Radom
Podziękował: 1 raz
Pomógł: 64 razy

[C++] runge kutty felberg — błąd kompilacji

Post autor: athame »

Wydzielenie zmiennych jest czytelniejsze dla osób mniej biegłych. Tu nie przekazywałem dobrych praktyk, a jedynie bezbłędny (z punktu widzenia kompilatora) kod.
makosia15
Użytkownik
Użytkownik
Posty: 11
Rejestracja: 25 sie 2016, o 19:45
Płeć: Kobieta
Lokalizacja: Polska

[C++] runge kutty felberg — błąd kompilacji

Post autor: makosia15 »

Cześć, chciałabym się spytać jak można zdefiniować i zapisać w C++, układ rownań z równania różniczkowego drugiego rzędu? Pozdrawiam.
athame
Użytkownik
Użytkownik
Posty: 576
Rejestracja: 2 lut 2012, o 21:42
Płeć: Mężczyzna
Lokalizacja: Radom
Podziękował: 1 raz
Pomógł: 64 razy

[C++] runge kutty felberg — błąd kompilacji

Post autor: athame »

Nie ma lekko, wg mnie bez dodatkowych bibliotek nie można. Pokaż konkretnie to równanie.
makosia15
Użytkownik
Użytkownik
Posty: 11
Rejestracja: 25 sie 2016, o 19:45
Płeć: Kobieta
Lokalizacja: Polska

[C++] runge kutty felberg — błąd kompilacji

Post autor: makosia15 »

oto równanie podobne jak w linku poniżej
[ciach]
Ostatnio zmieniony 12 wrz 2016, o 22:46 przez Jan Kraszewski, łącznie zmieniany 1 raz.
Powód: Nieregulaminowy zapis - obrazki zamiast zapisu w LaTeX-u.
athame
Użytkownik
Użytkownik
Posty: 576
Rejestracja: 2 lut 2012, o 21:42
Płeć: Mężczyzna
Lokalizacja: Radom
Podziękował: 1 raz
Pomógł: 64 razy

[C++] runge kutty felberg — błąd kompilacji

Post autor: athame »

OK, zdążyłem podejrzeć. Następnym razem zastosuj \(\displaystyle{ \LaTeX}\)-a bo ciężko było zrozumieć:
Pozwolę sobie przytoczyć dla potomnych (mam nadzieję poprawnie):
\(\displaystyle{ LI''+RI'+\frac{I}{c} = E\\
I'=I_{1}\\
LI_{1}'+RI_{1}+\frac{I}{c} = E}\)


Niestety brakuje mi wiedzy (umiejętności) matematycznej do tego. Wystarczy chyba rozbić na równania, gdzie pozbywasz się różniczki, dla pewności musiałbym jednak zobaczyć co to za metoda, bo jakoś nie spotkałem się z nią wcześniej (a przynajmniej nie przypominam sobie).
makosia15
Użytkownik
Użytkownik
Posty: 11
Rejestracja: 25 sie 2016, o 19:45
Płeć: Kobieta
Lokalizacja: Polska

[C++] runge kutty felberg — błąd kompilacji

Post autor: makosia15 »

Tak dobrze . Równanie różniczkowe drugiego rzędu rozbija się na równanie pierwszego rzędu. Stosuje się w takim przypadku układ równań. Różniczka drugiego rzędu, to jeden układ równań itd. Do scałkowania równań różniczkowych zwyczajnych stosuje się między innymi metodę rungego kutty felberga, który jest bardziej rozbudowany od metody runge kutty, ale działa na podobnej zasadzie. Są to metody całkowania różniczki zupełnej. W tych metodach wystarczy wstawić do równania podstawowego układ równań jako funkcje, algorytm też ulega w takim przypadku drobnym zmianom. W tym ostatnim linku co podałam to jest metoda runge kutty dla równania różniczkowego drugiego rzędu. Więc rozbita jest na układ równań, algorytm podstawowy też ulega drobnym zmianom. Nie wiem dokładnie, ale są tam tablice \(\displaystyle{ k}\) i \(\displaystyle{ k[j]}\), które odpowiadają pierwszej pochodnej \(\displaystyle{ k[1][j]}\) i drugiej pochodnej \(\displaystyle{ k[2][j]}\).
Ostatnio zmieniony 12 wrz 2016, o 22:49 przez Jan Kraszewski, łącznie zmieniany 1 raz.
Powód: Używaj LaTeXa do wszystkich wyrażeń matematycznych.
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] runge kutty felberg — błąd kompilacji

Post autor: kalwi »

makosia15 pisze:Tak dobrze . Równanie różniczkowe drugiego rzędu rozbija się na równanie pierwszego rzędu. Stosuje się w takim przypadku układ równań. Różniczka drugiego rzędu, to jeden układ równań itd. Do scałkowania równań różniczkowych zwyczajnych stosuje się między innymi metodę rungego kutty felberga, który jest bardziej rozbudowany od metody runge kutty, ale działa na podobnej zasadzie. Są to metody całkowania różniczki zupełnej. W tych metodach wystarczy wstawić do równania podstawowego układ równań jako funkcje, algorytm też ulega w takim przypadku drobnym zmianom. W tym ostatnim linku co podałam to jest metoda runge kutty dla równania różniczkowego drugiego rzędu. Więc rozbita jest na układ równań, algorytm podstawowy też ulega drobnym zmianom. Nie wiem dokładnie, ale są tam tablice \(\displaystyle{ k}\) i \(\displaystyle{ k[j]}\), które odpowiadają pierwszej pochodnej \(\displaystyle{ k[1][j]}\) i drugiej pochodnej \(\displaystyle{ k[2][j]}\).

I czego od nas oczekujesz, pisząc to?...
makosia15
Użytkownik
Użytkownik
Posty: 11
Rejestracja: 25 sie 2016, o 19:45
Płeć: Kobieta
Lokalizacja: Polska

[C++] runge kutty felberg — błąd kompilacji

Post autor: makosia15 »

Chodzi mi o zapisanie w języku c++ układu równań z równania rózniczki zupełnej drugiego rzędu.

Równanie różniczkowe zupełne drugiego rzędu:
\(\displaystyle{ y''=(x+y+y') \cdot (x+y+y')}\)
Gdzie \(\displaystyle{ y}\) jest znane.
Rozwiązujemy układ równań, przy czym zakładamy że \(\displaystyle{ y=y_1}\); \(\displaystyle{ y'=y_1'=y_2}\); \(\displaystyle{ y''=y_2'=(x+y_1+y_2) \cdot (x+y_1+y_2)}\)
Ja piszę to tak, ale nie wiem czy dobrze
Przed funkcją

Kod: Zaznacz cały

int main()

Kod: Zaznacz cały

double f(double x, double y2)
{
return y2;
}
double f1(double x, double y1, double y2)
{
return (x+y_1+y_2)*(x+y_1+y_2);
}
 
Dziękuję za pomoc
Pozdrawiam.
Ostatnio zmieniony 13 wrz 2016, o 10:53 przez makosia15, łącznie zmieniany 7 razy.
Awatar użytkownika
AiDi
Moderator
Moderator
Posty: 3841
Rejestracja: 25 maja 2009, o 22:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 45 razy
Pomógł: 702 razy

[C++] runge kutty felberg — błąd kompilacji

Post autor: AiDi »

Przeczytaj proszę PW.
makosia15
Użytkownik
Użytkownik
Posty: 11
Rejestracja: 25 sie 2016, o 19:45
Płeć: Kobieta
Lokalizacja: Polska

[C++] runge kutty felberg — błąd kompilacji

Post autor: makosia15 »

Dobrze, dziękuję.

-- 14 wrz 2016, o 13:10 --

Napisalam te równanie w c++ metodą runge-kutta-felberg. Ale nie kompiluje mi się tak jakbym chciała. Pokazuje na wyjściu jedne wartości, które są wynikiem tylko jednej pętli. I powinno być jak zaznaczyłam w programie 10 wierszy. Jeśli ktoś wie w czym jest problem, byłoby by fajnie gdyby się podzielił. Pozdrawiam.

Kod: Zaznacz cały

#include<iostream>
#include<cmath>
#include<fstream>
using namespace std;
double f1(double x, double y0, double y1)
{	
		return y1;
}

double f(double x, double y0, double y1)
{
	return (x+y1+y0)*(x+y1+y0);
}

int main()
{
	int n=10;
	double x[n],y1[n],y0[n],y3[n],y2[n],k[3][7],c0[n],c1[n];
	double h=0.1;
	int i;
	y0[0]=0;
	y1[0]=0;
	x[0]=0;
	for (i=1;i<=n;i++)
	{
	x[i]=x[0]+i*h;
	k[1][1]=h*f1(x[i],y0[i],y1[i]);
	k[2][1]=h*f(x[i],y0[i],y1[i]);
    k[1][2] = h* f1(x[i] + (h/4), y0[i] + (k[1][1]/4), y1[i]+(k[2][1]/4));
    k[2][2] = h* f(x[i] + (h/4), y0[i] + (k[1][1]/4), y1[i]+(k[2][1]/4));
    k[1][3]= h * f1(x[i] + (3*h/8), y0[i] + (3*k[1][1]/32) + (9*k[1][2]/32),y1[i] + (3*k[2][1]/32) + (9*k[2][2]/32));
    k[2][3]= h * f(x[i] + (3*h/8), y0[i] + (3*k[1][1]/32) + (9*k[1][2]/32),y1[i] + (3*k[2][1]/32) + (9*k[2][2]/32));
    k[1][4]= h * f1(x[i] + (12*h/13), y0[i] + (1932*k[1][1]/2197) - (7200*k[1][2]/2197) + (7296*k[1][3]/2197),y1[i] + (1932*k[2][1]/2197) - (7200*k[2][2]/2197) + (7296*k[2][3]/2197));
    k[2][4]= h * f(x[i] + (12*h/13), y0[i] + (1932*k[1][1]/2197) - (7200*k[1][2]/2197) + (7296*k[1][3]/2197),y1[i] + (1932*k[2][1]/2197) - (7200*k[2][2]/2197) + (7296*k[2][3]/2197));
    k[1][5]= h * f1(x[i] + h, y0[i] + (439*k[1][1]/216) - 8*k[1][2] + (3680*k[1][3]/513) - (845*k[1][4]/4104),y1[i] + (439*k[2][1]/216) - 8*k[2][2] + (3680*k[2][3]/513) - (845*k[2][4]/4104));
	k[2][5]= h * f(x[i] + h, y0[i] + (439*k[1][1]/216) - 8*k[1][2] + (3680*k[1][3]/513) - (845*k[1][4]/4104),y1[i] + (439*k[2][1]/216) - 8*k[2][2] + (3680*k[2][3]/513) - (845*k[2][4]/4104));
    k[1][6]= h * f1(x[i] + (h/2), y0[i] - (8*k[1][1]/27) + 2*k[1][2] - (3544*k[1][3]/2565) + (1859*k[1][4]/4104) - (11*k[1][5]/40),y1[i] - (8*k[2][1]/27) + 2*k[2][2] - (3544*k[2][3]/2565) + (1859*k[2][4]/4104) - (11*k[2][5]/40));
    k[2][6]= h * f(x[i] + (h/2), y0[i] - (8*k[1][1]/27) + 2*k[1][2] - (3544*k[1][3]/2565) + (1859*k[1][4]/4104) - (11*k[1][5]/40),y1[i] - (8*k[2][1]/27) + 2*k[2][2] - (3544*k[2][3]/2565) + (1859*k[2][4]/4104) - (11*k[2][5]/40));
    //cout<<k[1][1]<<" "<<k[1][2]<<" "<<k[1][3]<<" "<<k[1][4]<<" "<<k[1][5]<<" "<<k[1][6]<<endl;
    //cout<<k[2][1]<<" "<<k[2][2]<<" "<<k[2][3]<<" "<<k[2][4]<<" "<<k[2][5]<<" "<<k[2][6]<<endl;
	y3[i+1]=y1[i]+((25*(k[1][1]/216))+(1408*(k[1][3]/2565))+(2197*(k[1][4]/4101))-(k[1][5]/5));
	y2[i+1]=y0[i]+((25*(k[2][1]/216))+(1408*(k[2][3]/2565))+(2197*(k[2][4]/4101))-(k[2][5]/5));
	y1[i+1]=y1[i]+((16*(k[1][1]/135))+(6656*(k[1][3]/12852))+(28561*(k[1][4]/56430))-(9*(k[1][5]/50))+(2*(k[1][6]/55)));
	y0[i+1]=y0[i]+((16*(k[2][1]/135))+(6656*(k[2][3]/12852))+(28561*(k[2][4]/56430))-(9*(k[2][5]/50))+(2*(k[2][6]/55)));
	 //c1[i+1] = y1[i+1] - y3[i+1];
	
	

        cout << endl << x[i] << "   " <<y1[i]<<"   "<<y0[i]<< "   "<<c1[i=1]<<endl << endl;
}

system("pause");
return 0;
}
-- 14 wrz 2016, o 13:12 --Jeszcze raz:

Kod: Zaznacz cały

#include<iostream>
#include<cmath>
#include<fstream>
using namespace std;
double f1(double x, double y0, double y1)
{
	
	
		return y1;
}

double f(double x, double y0, double y1)
{
	return (x+y1+y0)*(x+y1+y0);
}

int main()
{
	int n=10;
	double x[n],y1[n],y0[n],y3[n],y2[n],k[3][7],c0[n],c1[n];
	double h=0.1;
	int i;
	y0[0]=0;
	y1[0]=0;
	x[0]=0;
	for (i=1;i<=n;i++)
	{
	x[i]=x[0]+i*h;
	k[1][1]=h*f1(x[i],y0[i],y1[i]);
	k[2][1]=h*f(x[i],y0[i],y1[i]);
    k[1][2] = h* f1(x[i] + (h/4), y0[i] + (k[1][1]/4), y1[i]+(k[2][1]/4));
    k[2][2] = h* f(x[i] + (h/4), y0[i] + (k[1][1]/4), y1[i]+(k[2][1]/4));
    k[1][3]= h * f1(x[i] + (3*h/8), y0[i] + (3*k[1][1]/32) + (9*k[1][2]/32),y1[i] + (3*k[2][1]/32) + (9*k[2][2]/32));
    k[2][3]= h * f(x[i] + (3*h/8), y0[i] + (3*k[1][1]/32) + (9*k[1][2]/32),y1[i] + (3*k[2][1]/32) + (9*k[2][2]/32));
    k[1][4]= h * f1(x[i] + (12*h/13), y0[i] + (1932*k[1][1]/2197) - (7200*k[1][2]/2197) + (7296*k[1][3]/2197),y1[i] + (1932*k[2][1]/2197) - (7200*k[2][2]/2197) + (7296*k[2][3]/2197));
    k[2][4]= h * f(x[i] + (12*h/13), y0[i] + (1932*k[1][1]/2197) - (7200*k[1][2]/2197) + (7296*k[1][3]/2197),y1[i] + (1932*k[2][1]/2197) - (7200*k[2][2]/2197) + (7296*k[2][3]/2197));
    k[1][5]= h * f1(x[i] + h, y0[i] + (439*k[1][1]/216) - 8*k[1][2] + (3680*k[1][3]/513) - (845*k[1][4]/4104),y1[i] + (439*k[2][1]/216) - 8*k[2][2] + (3680*k[2][3]/513) - (845*k[2][4]/4104));
	k[2][5]= h * f(x[i] + h, y0[i] + (439*k[1][1]/216) - 8*k[1][2] + (3680*k[1][3]/513) - (845*k[1][4]/4104),y1[i] + (439*k[2][1]/216) - 8*k[2][2] + (3680*k[2][3]/513) - (845*k[2][4]/4104));
    k[1][6]= h * f1(x[i] + (h/2), y0[i] - (8*k[1][1]/27) + 2*k[1][2] - (3544*k[1][3]/2565) + (1859*k[1][4]/4104) - (11*k[1][5]/40),y1[i] - (8*k[2][1]/27) + 2*k[2][2] - (3544*k[2][3]/2565) + (1859*k[2][4]/4104) - (11*k[2][5]/40));
    k[2][6]= h * f(x[i] + (h/2), y0[i] - (8*k[1][1]/27) + 2*k[1][2] - (3544*k[1][3]/2565) + (1859*k[1][4]/4104) - (11*k[1][5]/40),y1[i] - (8*k[2][1]/27) + 2*k[2][2] - (3544*k[2][3]/2565) + (1859*k[2][4]/4104) - (11*k[2][5]/40));
    //cout<<k[1][1]<<" "<<k[1][2]<<" "<<k[1][3]<<" "<<k[1][4]<<" "<<k[1][5]<<" "<<k[1][6]<<endl;
    //cout<<k[2][1]<<" "<<k[2][2]<<" "<<k[2][3]<<" "<<k[2][4]<<" "<<k[2][5]<<" "<<k[2][6]<<endl;
	y3[i+1]=y1[i]+((25*(k[1][1]/216))+(1408*(k[1][3]/2565))+(2197*(k[1][4]/4101))-(k[1][5]/5));
	y2[i+1]=y0[i]+((25*(k[2][1]/216))+(1408*(k[2][3]/2565))+(2197*(k[2][4]/4101))-(k[2][5]/5));
	y1[i+1]=y1[i]+((16*(k[1][1]/135))+(6656*(k[1][3]/12852))+(28561*(k[1][4]/56430))-(9*(k[1][5]/50))+(2*(k[1][6]/55)));
	y0[i+1]=y0[i]+((16*(k[2][1]/135))+(6656*(k[2][3]/12852))+(28561*(k[2][4]/56430))-(9*(k[2][5]/50))+(2*(k[2][6]/55)));
	 //c1[i+1] = y1[i+1] - y3[i+1];
	
	

        cout << endl << x[i] << "   " <<y1[i]<<"   "<<y0[i]<< "   "<<c1[i=1]<<endl << endl;
}

system("pause");
return 0;
}
ODPOWIEDZ