#python #for-loop
#питон #для-петли
Вопрос:
Интересно, как мне удалось реализовать итеративный поиск корней с помощью fsolve за интервал, пока он не нашел N корней ? (Предполагая, что я знаю, насколько малыми должны быть шаги, чтобы получить все корни во время процедуры) Есть ли способ сделать это с помощью простого цикла double for ?
Вот как это будет выглядеть для «простой» функции (cos(x)*x):
import numpy as np from scipy.optimize import fsolve import numpy as np def f(x): return np.cos(x)*x for n in range(1,10) : a = 0 k = 0 while k lt; 1000 : k = fsolve(f,a) if k == a : a = a 0.01 k = fsolve(f,a) else : print(k)
Но я не могу заставить это работать таким образом. Я не могу использовать chebpy, потому что моя реальная функция более сложна (включая функцию Бесселя), и чепби, похоже, не принимает такую функцию в качестве аргумента.
Правка : Исправлен отступ , эта программа выдает 0 (первое решение) бесконечное количество раз без остановки.
Ответ №1:
можете ли вы поделиться своей ошибкой? может быть, что-то связано с отступом вашей функции f(x), попробуйте изменить свой код на этот:
def f(x): return np.cos(x)*x
Комментарии:
1. Спасибо за ваш ответ, я изменил отступ. Ошибка в том, что программа продолжает возвращать первое решение без увеличения.
Ответ №2:
Я нашел решение, которое на данный момент выполняет свою работу. Он состоит из передачи массива, соответствующего интервалу поиска, а затем сортировки решений (в моем случае, только просмотр положительных решений, удаление дубликатов и т. Д. и т. Д.)
Возможно, это не лучший способ, но для меня он работает :
В этом примере я ищу 10 первых положительных решений cos(x)*x=0, предполагая, что они будут в [0,100].
import numpy as np from scipy.optimize import fsolve def f(x): return np.cos(x)*x int = np.arange(0,100,1) arr = np.array([int]) roots=fsolve(f,arr) # print(roots) roots=np.around(roots, decimals=5, out=None) a = roots[roots gt;= 0] b = np.unique(a) b=(b[:10]) print(b) Result : [ 0. 1.5708 4.71239 7.85398 10.99557 14.13717 17.27876 20.42035 23.56194 26.70354]
Мне пришлось использовать np.around, иначе np.unique не работал бы. Еще раз спасибо.