2014-10-06 3 views
0

Я пытаюсь решить систему тригонометрических уравнений, и я думаю, что 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` и получите ряд решений?

ответ

1

Ваш код выглядит нормально. Он печатает ошибки в конце, а не решение. Вы фактически проверяете решение, вызывая ваши уравнения с ответом, найденным fsolve в последних двух строках. если вы хотите увидеть значения переменных, вы можете сделать print x, y, z.

+0

Другой вопрос: 'fsolve' генерирует решение на основе начальных значений. Поэтому, если я изменил свои начальные значения с '(0,0,0)' на '(1,1,1), я мог бы получить еще одно новое решение. Есть ли способ определить «диапазон» начальных значений для каждой переменной «x, y, z» и получить ряд решений? Можете ли вы предложить мне, если есть способ сделать это? Еще раз спасибо –

+1

К сожалению, нет прямого способа найти все решения для нелинейных уравнений, даже если указан ряд начальных значений. Однако вы можете начать с нескольких различных стартовых точек и запомнить каждое решение, используя цикл 'for', что-то вроде' solutions = [fsolve (уравнения, начальная точка) для начальной точки в [(0, 0, 0), (1 , 1, 1)]) ' – chthonicdaemon

+0

Просто обратите внимание, что вы должны попробовать и написать эту программу, и если вы застряли, вы должны задать новый вопрос, а не задавать новые вопросы в комментариях. – chthonicdaemon