Proste wzory iteracyjne

0

Witam
Jestem w trakcie robienia programu z wykorzystaniem prostych wzorów iteracyjnych.Użytkownik może wybrać jedną z dwóch opcji funkcji: albo pierwiastek z x albo exp(x). W załączonym zdjęciu są jeszcze wzory, jakie chce wykorzystać do tych dwóch wzorów. Jest tylko jeden problem którego nie potrafię rozwiązać. Jak zrobić, żeby program obliczał każdą kolejną iteracje i wyświetlał kolejno wyniki poszczególnych iteracji do momentu aż program uzyska wynik końcowy. Próbuje tutaj albo pętlę for albo do while ale potrzebna mi pomóc, najlepiej jakby ktoś praktycznie mi pokazał. Z góry dziękuję za pomoc^^

0

Moglibyśmy Ci Coś pratycznie pokazać, ale Wrzuć co Próbowałeś i Powiedz co Rozumiesz przez "aż program uzyska wynik końcowy", jakaś zadana dokładność, liczba iteracji, coś innnego?

0

Umieścić printa w pętli?

0

To jest C#.

private void Licz_Click(object sender, EventArgs e)
        {
            double x, y0, wynik, z=1, i;
            bool xb, y0b;
            xb = double.TryParse(X.Text, out x);
            y0b = double.TryParse(Y0.Text, out y0);
            if (f1.Checked == true)
            {
                if (xb == false || x < 0)
                {
                    X.Text = "x musi być liczbą większą od 0";
                }
                if (y0b == false || y0 >= x || y0 <= 0||Y0.TextLength==0)
                {
                    Y0.Text = "y0 musi być liczbą mniejszą od x i większą od 0";
                }
                if (xb==true&y0b==true)
                {
                    wynik = y0;
                    for (i = 0; i < 10; i++)
                    {
                        wynik = 0.5 * ((x / wynik) + wynik);
                    }
                    Wynik.Text = wynik + "";
                }
            }
            if (f2.Checked == true)
            {
                if (xb == false || x < 0)
                {
                    X.Text = "x musi być liczbą większą od 0";
                }
                else
                {
                    wynik = 1 +x;
                    for (i = 2; i < 20; i++)
                    {
                        z = z * i;
                        wynik = wynik + ((long)Math.Pow(x,i) / z);
                    }
                    Wynik.Text = wynik + "";
                }
            }
        }
        private void f1_CheckedChanged(object sender, EventArgs e)
        {
            if (f1.Checked == true)
            {
                Y0.Visible = true;
                Y0.Visible = true;
            }
            if (f2.Checked == true)
            {
                Y0.Visible = false;
                Y0.Visible = false;
            }
0

Iteracja - czyli powtarzanie tego samego procesu przez określoną liczbę razy do momentu spełnienia warunku. W tym przypadku warunkiem ma być: w pierwszym programie y = sqrt (x) a w drugim y = exp(x). Nie wiem czy to coś pomogło

0

Znaczy w pierwszym wzorze na pierwiastek to x ma być większe od 0 a y0 to dowolną liczba
Dla drugiego wzoru x ma być liczba rzeczywistą

0

Dokładność! Kiedy zatrzymać iterację, pierwiastka z dwóch nie da się przyblizyć żadną skończoną liczbą.

0

Nie jestem w stanie określić bardziej dokładność. Po prostu musi być jak największa jak to możliwe.

Coś jeszcze wyjaśnić?

Zatrzymać iteracje trzeba kiedy wynik będzie bardzo bliski pierwiastkowi z x

0

To jest napisane w C++ ale kod będzie ten sam w C#, tylko z innym drukowaniem i inną minimalną wartością double (https://docs.microsoft.com/pl-pl/dotnet/api/system.double.minvalue?view=netframework-4.8). Robisz błąd w swoim kodzie, bo nie ma tam iteracji, trzeba jeszcze podstawiać, żeby wartości się zmieniały (y0 = yn). Jeśli dokładność jest mniejsza niż najmniejesza wartość zmienno przecinkowa w komputerze program się zatrzymuje, ciężko wyobrazić sobie większą dokładność. Jeszcze uwaga 2.0 to double literal w C++ w C#, Musisz chyba dodać sufiks D.

void sqrt_iterative(double x) {
	double y0 = 1;
	double yn = 0;
	for (int i = 0; i < 1000; ++i) {
		yn = 0.5 * (x / y0 + y0);
		if (abs(yn - y0) < 2 * DBL_MIN) 
			break;
		y0 = yn;
		cout << yn << " "; 
	}
        cout <<"\n";
}

int main(int argc, char **argv)
{	
	sqrt_iterative(2.0); // -> 1.5 1.41667 1.41422 1.41421 1.41421
	return 0;
}
1
mcskib90 napisał(a):

Nie jestem w stanie określić bardziej dokładność. Po prostu musi być jak największa jak to możliwe.

W tym kodzie jesteś ograniczony przez dokładność double, więc możesz iterawać tak długo aż poprzedni wynik będzie się równać nowy wynik

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