Нахождение N корней с помощью итеративной процедуры с помощью fsolve (python)

#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 не работал бы. Еще раз спасибо.