Proste wzory iteracyjne

Odpowiedz Nowy wątek
2019-10-09 11:08
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^^

Pokaż kod - szweszwe 2019-10-09 11:13
Pokaż kod. Bo coś już chyba napisałeś. - Delor 2019-10-09 11:13
Jeśli chodzi o tą z pierwiastkiem to mam zrobioną ale nie wiem jak zrobić to z eksponenta i tu zwracam się o pomoc - mcskib90 2019-10-11 09:38
public void exp() { x = double.Parse(wpr_x.Text); y = Math.Exp(x); y1 = 1 + x; do { } while wynik1.Text = wynik2.ToString(); } - mcskib90 2019-10-11 09:38
Dokładność ma być jak najwieksza - mcskib90 2019-10-11 09:39
I przepraszam, że tak długo nie odpisywałem. Stosuje do while dlatego, że liczba iteracji nie jest z góry określona - mcskib90 2019-10-11 09:40

Pozostało 580 znaków

2019-10-09 11:17
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?


Pozostało 580 znaków

2019-10-09 11:19
0

Umieścić printa w pętli?

Pozostało 580 znaków

2019-10-09 11:24
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;
            }
edytowany 1x, ostatnio: cerrato, 2019-10-09 11:27
Format kodu prosimy. - lion137 2019-10-09 11:25
Dziękuję, i mod się na coś przydał :-D - lion137 2019-10-09 11:29
chociaż raz ;) - cerrato 2019-10-09 11:31

Pozostało 580 znaków

2019-10-09 11:33
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

Częściowo, nie da się policzyć pierwiastka czy e do x dokładnie (może dla wybranych liczb). - lion137 2019-10-09 11:34
@lion137: prośba: prowadźmy dyskusję w postach a nie komentarzach. Ty piszesz w komentach, OP odpowiada w postach i robi się zamieszanie. Komentarze są raczej do offtopowania, a Twoje odpowiedzi dotyczą głównego tematu wątku. Dzięki :) - cerrato 2019-10-09 11:41

Pozostało 580 znaków

2019-10-09 11:39
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ą

Pozostało 580 znaków

2019-10-09 11:44
0

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


Pozostało 580 znaków

2019-10-09 11:55
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

edytowany 1x, ostatnio: cerrato, 2019-10-09 12:04
Po googluj liczba nie wymierna xD. - Akihito 2019-10-09 12:02
@mcskib90: nie umieszczaj proszę 3 jednozdaniowych postów jeden pod drugim, bo wprowadza to chaos. Wszystko mogłeś zrobić w jednym. - cerrato 2019-10-09 12:04
Sorry po prostu dawno nie korzystałem z tego forum - mcskib90 2019-10-09 12:05

Pozostało 580 znaków

2019-10-09 12:15
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[...]invalue?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;
}

Ok dzieki. A jak to będzie w przypadku exp(x)? - mcskib90 2019-10-09 12:26
No dobra zajrzałem ale nie rozumiem jak wynik każdej kolejnej iteracji ma być pokazywany w textBoxie i warunek kiedy program ma zakończyć działanie czyli wynik będzie miał największą dokładność. Mógłbyś wytłumaczyć? - mcskib90 2019-10-09 12:44
Po prostu, Drukuj sum co iterację; a warunek? Jeśli suma zacznie się nie zmieniać, to stop. - lion137 2019-10-09 12:48
Dzięki za odpowiedź. Mam jeszcze jedno pytanie. Jeśli bym zamiast pętli for chciałbym dać pętlę do while ponieważ nie chciałbym mieć założonej z góry liczby iteracji to jaki kod sugeruje się napisać w ciele instrukcji i warunku? Mam poniekąd swoją myśl ale chciałbym poznać czyjąś inną opinie - mcskib90 2019-10-09 17:20
Dobrze jest jakoś ograniczyć pętlę, teoretycznie Możesz nie osiągnąć zadanej dokładności i program będzie się wykonywał w nieskończoność, chociaż praktycznie, jak nie ma zbieżności do tysiąca iteracji, to znaczy, że coś w ogóle jest nie OK. - lion137 2019-10-09 18:53

Pozostało 580 znaków

2019-10-09 12:18
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


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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