Решение неявного уравнения с помощью scipy.optimize.fsolve ⇐ Python
Решение неявного уравнения с помощью scipy.optimize.fsolve
Я пришел задать этот вопрос из очень похожего вопроса, где я «научился», как использовать fsolve для решения неявных уравнений.
Мое уравнение определяется этой функцией:
def fn4(Fs): return ( np.sum( (lamL * c + lamW * np.tan(np.radians(phi))) / (np.cos(lamA) * (1 + np.tan(lamA) * np.tan(np.radians(phi)) / Fs)) ) / np.sum(lamW * np.sin(lamA)) ) где:
c = 10 фи = 30 lamela1 = {'W':887.36, 'альфа':np.radians(46.71), 'L':19.325} lamela2 = {'W':1624.8, 'альфа':np.radians(22.054), 'L':14.297} lamela3 = {'W':737.43, 'альфа':np.radians(1.9096), 'L':13.258} ламель = [ламела1, ламель2, ламель3] lamW = np.array([[i['W'] for i в ламеле]]) lamA = np.array([[i['alpha'] for i в ламеле]]) lamL = np.array([[i['L'] for i в ламеле]]) Я решил эту проблему, создав простую рекурсию:
def iterf(f, Fsi): если np.isclose(Fsi, fn4(Fsi)) == True: вернуть ФСИ еще: вернуть iterf(f, fn4(Fsi)) что дает
iterf(fn4, 1) 1,8430 Но когда я пытаюсь использовать scipy.optimize.fsolve (как fsolve(fn4, 1)), я получаю:
RuntimeWarning: деление на ноль встречается в true_divide / (np.cos(lamA) * (1 + np.tan(lamA) * np.tan(np.radians(phi)) / Fs)) Я не знаю, как именно работает fsolve (что мне хотелось бы узнать), но я предполагаю, что для оптимизации необходимо в какой-то момент ввести Fs как 0, что производит деление нуля. Как я могу использовать такую функцию, чтобы получить результат?
РЕДАКТИРОВАТЬ:
Теоретической основой является устойчивость грунтовых склонов. Полученный в результате Fs является коэффициентом безопасности – мерой, значения которой составляют >1 для устойчивых склонов и
Я пришел задать этот вопрос из очень похожего вопроса, где я «научился», как использовать fsolve для решения неявных уравнений.
Мое уравнение определяется этой функцией:
def fn4(Fs): return ( np.sum( (lamL * c + lamW * np.tan(np.radians(phi))) / (np.cos(lamA) * (1 + np.tan(lamA) * np.tan(np.radians(phi)) / Fs)) ) / np.sum(lamW * np.sin(lamA)) ) где:
c = 10 фи = 30 lamela1 = {'W':887.36, 'альфа':np.radians(46.71), 'L':19.325} lamela2 = {'W':1624.8, 'альфа':np.radians(22.054), 'L':14.297} lamela3 = {'W':737.43, 'альфа':np.radians(1.9096), 'L':13.258} ламель = [ламела1, ламель2, ламель3] lamW = np.array([[i['W'] for i в ламеле]]) lamA = np.array([[i['alpha'] for i в ламеле]]) lamL = np.array([[i['L'] for i в ламеле]]) Я решил эту проблему, создав простую рекурсию:
def iterf(f, Fsi): если np.isclose(Fsi, fn4(Fsi)) == True: вернуть ФСИ еще: вернуть iterf(f, fn4(Fsi)) что дает
iterf(fn4, 1) 1,8430 Но когда я пытаюсь использовать scipy.optimize.fsolve (как fsolve(fn4, 1)), я получаю:
RuntimeWarning: деление на ноль встречается в true_divide / (np.cos(lamA) * (1 + np.tan(lamA) * np.tan(np.radians(phi)) / Fs)) Я не знаю, как именно работает fsolve (что мне хотелось бы узнать), но я предполагаю, что для оптимизации необходимо в какой-то момент ввести Fs как 0, что производит деление нуля. Как я могу использовать такую функцию, чтобы получить результат?
РЕДАКТИРОВАТЬ:
Теоретической основой является устойчивость грунтовых склонов. Полученный в результате Fs является коэффициентом безопасности – мерой, значения которой составляют >1 для устойчивых склонов и
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение