calkowanie numeryczne przy uzyciu metody vrk4

0

witam
mam maly problem - otoz dostalem do rozwiazania takie oto zadanie:
http://img74.imageshack.us/my.php?image=dsc00044lh8.jpg
no wiec wzialem sie do roboty i splodzilem taki oto program:

#include <stdio.h>
#include <math.h>
#define MAXN 10

void vrk4( double x0,double y0[],double h,int n,void (*fun)(double,double*,double*),double y1[]);
void fun(double t,double y[],double f[]);

void main()
{
	double m,c,a,b,x0,v0,t0,tk,h,y[2],y1[2];
	t0=0.0;
	printf("Podaj mase ciala\n");
	scanf("%lf",&m);
	printf("Podaj wspolczynnik c\n");
	scanf("%lf",&c);
	printf("Podaj wspolczynnik k1\n");
	scanf("%lf",&a);
	printf("Podaj wspolczynnik k2\n");
	scanf("%lf",&b);
	printf("Podaj polozenie poczatkowe ciala\n");
	scanf("%lf",&x0);
	if(x0==0)
	printf("Wartosc sprzeczna z warunkami poczatkowymi\n");
	else
	{
        printf("Podaj predkosc poczatkowa ciala\n");
	    scanf("%lf",&v0);
	    if(v0==0)
	    printf("Wartosc sprzeczna z warunkami poczatkowymi\n");
	    else
	    {
            
	        printf("Podaj krok calkowania\n");
     	    scanf("%lf",&h);
	        printf("Podaj czas tk\n\n");
	        scanf("%lf",&tk);
	        y[0]=x0;
	        y[1]=v0;
	        for(t0;t0<=tk;t0+=h)
            {                           
                           vrk4(t0,y,h,2,fun,y1);
                           printf("t = %lf\t x = %lf\t v=%lf\n",t0,y[0],y[1]);
                           y[0]=y1[0];
                           y[1]=y1[1];
            }
         }
     }
getch();
}

void fun(double t, double y[], double f[])
{	
double m,c,a,b;
f[0]=y[1];
f[1]=((y[0]/fabs(y[0]))*(-a*(1+b*y[0]*y[0]))-c*y[1])/m;
}

void vrk4( double x0, double y0[], double h, int n, void (*fun)(double, double*, double*), double y1[] )
{
	int		i;
	double	k1[MAXN], k2[MAXN], k3[MAXN], k4[MAXN];
	double	ytmp[MAXN];

	fun( x0, y0, k1);
	for ( i=0; i<n; ++i)
	{
		k1[i] *= h;
		ytmp[i] = y0[i] + k1[i]/2.0;
	}

	fun( x0+h/2.0, ytmp, k2);
	for ( i=0; i<n; ++i)
	{
		k2[i] *= h;
		ytmp[i] = y0[i] + k2[i]/2.0;
	}

	fun( x0+h/2.0, ytmp, k3);
	for ( i=0; i<n; ++i)
	{
		k3[i] *= h;
		ytmp[i] = y0[i] + k3[i];
	}

	fun( x0+h, ytmp, k4);
	for ( i=0; i<n; ++i)
		k4[i] *= h;

	for ( i=0; i<n; ++i)
		y1[i] = y0[i] + (k1[i] + 2.*k2[i] + 2.*k3[i] + k4[i])/6.;

}

niestety cos jest nie tak, bo:

  1. ta sprezyna nie zachowuje sie tu jak sprezyna
    2.bez wzgledu na to, jakie dane wprowadzi sie z klawiatury, program i tak wyswietla identyczne wyniki (wziete zreszta z kosmosu)
    czy ktos moze mi jakos z tym pomoc? tzn powiedziec gdzie cos zrobilem zle i jak to naprawic, zeby ten program dzialal jak powinien ;>
    z gory dziekuje za pomoc :)
0

domyślam się że metoda vrk4 to tak naprawdę metoda Eulera.
Googlowanie tego kończy się słabymi wynikami (metoda vrk4 = 3 strony) (method vrk4 = 29 strony), wskazuje to na to, że niewiele ludzi stosuję tą dziwną nazwę! Zresztą te strony i tak są do bani.
Następnym uwzględnij to, że możemy nie znać tak niezwykłej terminologii.

Program nie jest prosty, a nie ma komentarzy, ani nazw zmiennych dobrze sugerujących o co chodzi.
Skutek jest taki, że zniechęca to do czytania.

A i jeszcze jedno! Czy potraktowałeś to coś debugerem?

edit:
Szybki rzut okiem na fun i widać poważny błąd, wskazujący na brak zrozumienia podstawowych zasad programowania.
Zmienne lokalne m, c, a, b w tej funkcji fun są użyte ale nigdy nie nadano im wartości (zawierają śmieci z ze stosu).

0

to co wskazal marek wzielo sie z:

void main()
{
	double m,c,a,b,x0,v0,t0,tk,h,y[2],y1[2];    //tu masz M C A B
	t0=0.0;
	printf("Podaj mase ciala\n");
	scanf("%lf",&m);                         //pobierasz..
	printf("Podaj wspolczynnik c\n");
	scanf("%lf",&c);
	printf("Podaj wspolczynnik k1\n");
	scanf("%lf",&a);
	printf("Podaj wspolczynnik k2\n");
	scanf("%lf",&b);
....
}

void fun(double t, double y[], double f[])
{	
double m,c,a,b;    //a tutaj sadzisz ze magicznie sie pojawia tamte wartosci?
f[0]=y[1];
f[1]=((y[0]/fabs(y[0]))*(-a*(1+b*y[0]*y[0]))-c*y[1])/m;
}

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