Итерация с фиксированной точкой в Python
Я новичок в Python, и у меня проблема с этой задачей:
- Напишите функцию, которая находит корни математической функции пользователя, используя итерацию с фиксированной точкой.
- Используйте эту функцию, чтобы найти корни:
x^3 + x - 1
. - Постройте график зависимости аппроксимации корней от номера шага итерационного алгоритма.
Я впервые использую Python, поэтому мне очень нужна помощь. Это мой код, но он не работает:
import math
import matplotlib.pyplot as plt
import numpy as np
def fixedp (function, x0, min = 0.001, max = 100):
i = 0
e = 1
xp = []
while (e > min and i < max):
x = function(x0)
e = norm(x0 - x)
x0 = x
xp.append(x0)
i = i + 1
return x, xp
fx = input("Wrote function : ")
function = lambda x: eval(fx)
x_start = 0.5
xf,xp = fixedp(function, x_start)
x = linspace(0,2,100)
y = function(x)
plot(x, y, xp, function(xp), 'bo', x_start, f(x_start), 'ro', xf, f(xf), 'go', x, x, 'k')
show()
3 ответа
Решение
Прежде всего отмечу, что логика вашего кода отличная и работает. Есть некоторые проблемы с отступами и синтаксисом, поэтому я переписал ваш код.
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)
if __name__ == '__main__':
main()
Удачи в будущем с Python!
У меня такая ошибка:
11 x = None
12 while error > min_error and i < max_iteration:
---> 13 x = given_function(x0)
14 error = abs(x0 - x)
15 x0 = x
TypeError: 'str' object is not callable
Хорошо, значит, код от Йонлифа работает, но я попытался поставить:
next_function = 'x ** 3 + x - 1'
x_start = 0.9
xf, xp = iteration(next_function, x_start)
plot(xf, xp, x_start, next_function)
в основную функцию, и она не работает, я не понимаю, почему