2012-05-18 6 views
0

Я пытаюсь решить уравнение f(x) = x-sin(x) -n*t -m0Решая уравнение с fsolve SciPy в

В этом уравнении n и m0 атрибуты, определенные в моем классе. Кроме того, t является постоянным целым числом в уравнении, но оно должно меняться каждый раз.

Я решил уравнение, чтобы получить «новое уравнение». Я импортировал scipy.optimize

def f(x, self): 
    return (x - math.sin(x) -self.M0 - self.n*t) 

def test(self,t): 
    return fsolve(self.f, 1, args=(t)) 

Какие-либо исправления и предложения, чтобы заставить его работать?

+3

Можете ли вы дать нам полный пример, в том числе, что об этом «не работает»? – robert

+1

Я не думаю, что я когда-либо видел 'f (x, self)' до .. первый аргумент получит экземпляр, независимо от того, что вы его называете. – DSM

+0

с fsolve от scipy.optimize – Saybia

ответ

4

Я вижу как минимум две проблемы: вы перепутали порядок аргументов с f, и вы не даете f доступ к t. Нечто подобное должно работать:

import math 
from scipy.optimize import fsolve 

class Fred(object): 
    M0 = 5.0 
    n = 5 

    def f(self, x, t): 
     return (x - math.sin(x) -self.M0 - self.n*t) 

    def test(self, t): 
     return fsolve(self.f, 1, args=(t)) 

[обратите внимание, что я поленился и сделал M0 и n членов класса]

, который дает:

>>> fred = Fred() 
>>> fred.test(10) 
array([ 54.25204733]) 
>>> import numpy 
>>> [fred.f(x, 10) for x in numpy.linspace(54, 55, 10)] 
[-0.44121095114838482, -0.24158955381855662, -0.049951288133726734, 
0.13271070588400136, 0.30551399241764443, 0.46769772292130796, 
0.61863201965219616, 0.75782574394219182, 0.88493255340251409, 
0.99975517335862207] 
+0

Это сработало !!! Спасибо, человек, я очень ценю это! – Saybia

0

Вы используете какой-либо алгоритм поиска корней. Есть несколько общих целей, поэтому было бы полезно узнать, какой из них.

Вы должны знать три вещи:

  1. алгоритма вы с помощью
  2. Уравнения вы найти корни для
  3. Первоначальной догадки и диапазон, в котором вы смотрите

Вам необходимо знать, что некоторые комбинации могут не иметь никаких корней.

Визуализация функций, представляющих интерес, может быть полезна. У вас есть две: линейная функция и синусоид. Если бы вы построили два объекта, какие наборы констант дали бы вам пересечения? Пересечение - это корень, который вы ищете.

+0

, основная проблема заключается в том, что это должно быть сделано в классе. поэтому мне нужно определить уравнение в f (x, self). – Saybia

1

Вам нужно определить f() так:

def f(self, x, t): 
    return (x - math.sin(x) - self.M0 - self.n * t) 

Иными словами:

  1. self на первом месте (он всегда делает);
  2. затем появляется текущее значение x;
  3. затем приходят аргументы, которые вы указываете на fsolve().
Смежные вопросы