Я пытаюсь решить систему тригонометрических уравнений, и я думаю, что Python не создает правильное решение. Уравнения Я пытаюсь решить:Решение тригонометрических нелинейных уравнений с использованием python: что я делаю неправильно?
1 - 2cosθ + 2cosθ - 2cosθ = -0,8
1 - 2cos5θ + 2cos5θ - 2cos5θ = 0
1 - 2cos7θ + 2cos7θ - 2cos7θ = 0
Мой Python код:
from scipy.optimize import fsolve
import math
import numpy as np
def equations(p):
x,y,z = p
f1 = (1 - 2*math.cos(math.radians(x)) + 2*math.cos(math.radians(y)) - 2*math.cos(math.radians(z)) + 0.8)
f2 = (1 - 2*math.cos(math.radians(5*x)) + 2*math.cos(math.radians(5*y)) - 2*math.cos(math.radians(5*z)))
f3 = (1 - 2*math.cos(math.radians(7*x)) + 2*math.cos(math.radians(7*y)) - 2*math.cos(math.radians(7*z)))
return (f1,f2,f3)
x,y,z = fsolve(equations,(0,0,0))
print equations((x,y,z))
Это печатное:
(-1.9451107391432743e-13, +4,241273998673023 e-12, -1.5478729409323932e-12)
что неправильно, потому что я проверил это с помощью:
print (1 - 2*math.cos(math.radians(5*-1.9451107391432743e-13)) +
2*math.cos(math.radians(5*4.241273998673023e-12)) -
2*math.cos(math.radians(5*-1.5478729409323932e-12)))
и это не печатает но отпечатки -1. Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно здесь?
Другой вопрос: fsolve
генерирует решение на основе начальных значений. Поэтому, если я изменю свои начальные значения от (0,0,0)
до (1,1,1), I might get another new solution. Is there a way I can define a "range" of initial values for each variable
x, y, z` и получите ряд решений?
Другой вопрос: 'fsolve' генерирует решение на основе начальных значений. Поэтому, если я изменил свои начальные значения с '(0,0,0)' на '(1,1,1), я мог бы получить еще одно новое решение. Есть ли способ определить «диапазон» начальных значений для каждой переменной «x, y, z» и получить ряд решений? Можете ли вы предложить мне, если есть способ сделать это? Еще раз спасибо –
К сожалению, нет прямого способа найти все решения для нелинейных уравнений, даже если указан ряд начальных значений. Однако вы можете начать с нескольких различных стартовых точек и запомнить каждое решение, используя цикл 'for', что-то вроде' solutions = [fsolve (уравнения, начальная точка) для начальной точки в [(0, 0, 0), (1 , 1, 1)]) ' – chthonicdaemon
Просто обратите внимание, что вы должны попробовать и написать эту программу, и если вы застряли, вы должны задать новый вопрос, а не задавать новые вопросы в комментариях. – chthonicdaemon