Wątek zablokowany 2013-12-13 16:19 przez madmike.

Metoda Dychotomii - implementacja

0

Witam. Moje ostatnie zadanie związane z obliczeniami numerycznymi i pythonem. Poprzednio bardzo pomocne okazały się wasze wskazówki więc i tym razem postanowiłem tutaj napisać.

Dychotomia:
user image
user image

a oto kod:

import math

def funkcja(x):
    return (pow(0.5*x,2) - math.sin(x))

Xl=60
Xp=150
Xm = (Xl+Xp)/2
f = funkcja

while True:
    if(f(Xl)>f(Xp)):
        Xu = Xm
    else:
        Xl = Xm
    if(Xm>100):
        break
print ("Wynik: %.2f")%f(Xm)

Jak widać program działa, problem w tym że chciałem się upewnić czy wykonałem go dobrze i czy zwraca prawidłowy wynik. Mógłby ktoś z was to potwierdzić lub mnie poprawić?

0

Co do tego warunku stopu

if(Xm>100):
        break

Nie jestem pewien. Wpisałem na pałę i zadziałało. Jak zwiększę lub zmniejszę zmienną to liczy liczy i wyliczyć nie może

0
        Xu = Xm

wat?
2. Nigdzie nie zmieniasz Xm to po co w ogóle ta cała pętla? o_O

1

W kodzie jest trochę nadmiarowych instrukcji. Poniższy kod będzie działał identycznie:

import math
 
def funkcja(x):
    return (pow(0.5*x,2) - math.sin(x))
 
Xl=60
Xp=150
Xm = (Xl+Xp)/2
f = funkcja
 
while True:
    if(Xm>100):
        break
print ("Wynik: %.2f")%f(Xm)

Z tym, że dalej pętla jest jednym wielkim (no dobra, teraz już mniejszym) WTFem.

1
from math import *
 
def f(x):
    return (0.5*x)**2 - sin(x)
 
a = 0
b = 2
 
while True:
    xl = a + 0.25*(b-a)
    xp = a + 0.75*(b-a)
    if(f(xl)>f(xp)):
        a = xl
    else:
        b = xp
    if((b-a) < 10**(-6)):
        break
print ("Wynik: %10.8f %10.8f") % (a,f(a))

A taka z ciekawości, co studiujesz? Twoje pytania dotyczą pisania programików rozwiązujących problemy matematyczne, ale z treści pytań wynika, że nie umiesz programować i nie rozumiesz matematyki.

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