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^^
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?
Umieścić printa w pętli?
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;
}
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
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ą
Dokładność! Kiedy zatrzymać iterację, pierwiastka z dwóch nie da się przyblizyć żadną skończoną liczbą.
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
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;
}
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