Metoda iteracyjna w Pythonie

0

Witam. Robię dopiero pierwsze kroki w Pythonie, a dostałem dość trudne zadanie.
Mam napisać funkcję, która pomoże mi znaleźć miejsca zerowe podanej przez użytkownika funkcji za pomocą metody znajdowania punktu stałego. Napisaną funkcję mam też wykorzystać do znalezienia miejsc zerowych funkcji x^3 + x - 1. Dodatkowo mam narysować wykres zależności aproksymacji miejsca zerowego przez algorytm od numeru kroku algorytmu.
Bardzo proszę o jakąkolwiek pomoc, bo próbowałem już to zrobić, ale nic mi nie działa :(

0

Jak Chcesz gotowca, to $, a jak nie to Wykaż się czymś, co już Masz, gdzie szukałeś rozwiązania, etc...

0

Aktualnie mój kod prezentuje się następująco:

import matplotlib.pyplot as plt
import numpy as np
from typing import Tuple, List
from math import *


def iteration(given_function, x0, min_error=0.001, max_iteration=3) -> Tuple[float, List]:
    i = 0
    error = 1
    xp = []
    x = None
    while error > min_error and i < max_iteration:
        x = given_function(x0)
        error = abs(x0 - x)
        x0 = x
        xp.append(x0)
        i += 1
    print(xp)
    return x, xp


def plot(xf, xp, x_start, given_function):
    function_v = np.vectorize(given_function)

    x = np.linspace(0, 2, 100)
    y = function_v(x)
    plt.plot(x, y)
    plt.plot(xp, function_v(xp), 'bo')
    plt.plot(x_start, given_function(x_start), 'ro')
    plt.plot(xf, given_function(xf), 'go')
    plt.plot(x, x, 'k')
    plt.show()


def main():
    fx = input("Write function: ")
    given_function = lambda x: eval(fx)

    x_start = 0.9
    xf, xp = iteration(given_function, x_start)

    plot(xf, xp, x_start, given_function)

main()

Teraz nie wiem jak wkleic do tego kodu funkcje x^3 + x - 1. Próbowałem dodać do maina:

next_function = 'x ** 3 + x - 1'

    x_start = 0.9
    xf, xp = iteration(next_function, x_start)

    plot(xf, xp, x_start, next_function)

ale tak niestety nie dziala. Nie do konca rozumiem czemu

0

jak użytkownik poda x*2 to eval musi mieć dostęp do zmiennej o nazwie x. Spróbuj coś takiego:

given_function = lambda x: eval(fx.replace('x', str(x)))

Może w pakiecie sympy będzie coś co stworzy funkcję z podanego napisu.

0

Dla prostej funkcji, taki hak działa"

f_string = "def f(x): return " + input()
exec(f_string)

def main():
	print(f(1)) # -> 42, input: x + 41

Źródło: https://stackoverflow.com/a/6098736

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