2013-03-26 3 views
2

Я никогда не использовал python, но Mathematica не может справиться с уравнением, которое я пытаюсь решить. Я пытаюсь решить для переменной «а» следующих уравнений, где s, c, mu и delta t являются известными параметрами.с использованием python для решения нелинейного уравнения

enter image description here

Я пытался делать NSolve, решить, и т.д. в Mathematica, но он работает уже в течение часа, не повезло. Поскольку я не знаком с Python, есть ли способ использовать Python для решения этого уравнения для a?

+0

Не могли бы вы привести пример ввода и вывода? – Serdalis

+0

@ Сердалис, что ты имеешь в виду? – dustin

+0

это довольно сложно, и это очень поможет любому, кто пытается воссоздать его, если вы представили пример формулы в действии. Ничего такого грандиозного, как разработка, но решение для набора ценностей было бы весьма полезно. – Serdalis

ответ

3

Вы не найдете аналитического решения этих уравнений, потому что они трансцендентны, содержащие a как внутри, так и снаружи тригонометрической функции.

Я думаю, что проблема с численными решениями заключается в том, что диапазон допустимых значений для a ограничен arcsin. Поскольку arcsin определяется только для аргументов между -1 и 1 (если вы хотите, чтобы a был реальным), ваши формулы для alpha и beta требуют, чтобы a > s/2 и a > (s-c)/2.

В Python, вы можете найти нуль вашего третьего уравнения (переписать в виде f(a) = 0) с помощью brentq функции:

import numpy as np 
from scipy.optimize import brentq 

s = 10014.6 
c = 6339.06 
mu = 398600.0 
dt = 780.0 
def f(a): 
    alpha = 2*np.arcsin(np.sqrt(s/(2*a))) 
    beta = 2*np.arcsin(np.sqrt((s-c)/(2*a))) 
    return alpha - beta - (np.sin(alpha)-np.sin(beta)) - np.sqrt(mu/a**3)*dt 

a0 = max(s/2, (s-c)/2) 
a = brentq(f, a0, 10*a0) 

Edit:

Чтобы уточнить путь brentq(f,a,b) работы является что он ищет нуль f с интервалом [a,b]. Здесь мы знаем, что a составляет не менее max(s/2, (s-c)/2). Я просто догадался, что в 10 раз это была правдоподобная верхняя граница, и это работало для данных параметров. В более общем плане вам необходимо убедиться, что f меняет знак между a и b. Вы можете узнать больше о том, как работает функция в SciPy docs.

+0

Зачем вам нужно определить a0, а затем сказать brentq (f, a0,10 * a0)? Я спрашиваю, потому что я никогда не использовал Python, и я хотел бы знать, почему так я могу попробовать самостоятельно, если что-то подобное встречается снова. – dustin

+0

Как работает brentq, он начинается с a (здесь a0) и ищет нуль данной функции f между a (здесь a0) и b (10 * a0). Определение a0 необходимо, так как для функции brentq требуется место для поиска нулей. Как сказал Рэй, это объясняется в [документации для функции brentq] (http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.brentq.html) –

2

Я думаю, что его стоит изучить поведение функции, прежде чем пытаться ее решить. Не делая этого, вы не знаете, есть ли уникальное решение, множество решений или нет решения. (Самая большая проблема заключается в многих решениях, где числовые методы могут не дать вам решение, которое вам нужно/ожидайте, - и если вы вслепую его используете, могут возникнуть «плохие вещи»). Вы хорошо изучаете поведение, используя scipy и ipython. Это пример ноутбук, который делает это

# -*- coding: utf-8 -*- 
# <nbformat>3.0</nbformat> 

# <codecell> 

s = 10014.6 
c = 6339.06 
mu = 398600.0 
dt = 780.0 

# <codecell> 

def sin_alpha_2(x): 
    return numpy.sqrt(s/(2*x)) 
def sin_beta_2(x): 
    return numpy.sqrt((s-c)/(2*x)) 
def alpha(x): 
    return 2*numpy.arcsin(numpy.clip(sin_alpha_2(x),-0.99,0.99)) 
def beta(x): 
    return 2*numpy.arcsin(numpy.clip(sin_beta_2(x),-0.99,0.99)) 

# <codecell> 

def fn(x): 
    return alpha(x)-beta(x)-numpy.sin(alpha(x))+numpy.sin(beta(x)) - dt * numpy.sqrt(mu/numpy.power(x,3)) 

# <codecell> 

xx = numpy.arange(1,20000) 
pylab.plot(xx, numpy.clip(fn(xx),-2,2)) 

Graph of fn

# <codecell> 

xx=numpy.arange(4000,10000) 
pylab.plot(xx,fn(xx)) 

enter image description here

# <codecell> 

xx=numpy.arange(8000,9000) 
pylab.plot(xx,fn(xx)) 

enter image description here

Это показывает, что мы ожидаем, чтобы найти решение с между 8000 и 9000. d изгиб на кривой около 5000 и более ранний раствор при температуре около 4000 обусловлен отсечением, необходимым для того, чтобы заставить арксин вести себя. Действительно, уравнение не имеет смысла ниже около а = 5000. (точное значение - a0, заданное в решении Rays). Это дает хороший диапазон, который можно использовать с методами в решении Rays.

+0

Это не имеет смысла потому что ниже 5017 я считаю, что концентрические круги орбит не пересекаются. Это было частью проблемы орбитальной механики, поэтому мы решаем для полумаксимальной оси, которая заставляет объект переходить в точку p2 за 780 секунд 13мин. – dustin

Смежные вопросы