2017-02-09 17 views
0

Я занят просто выполнением кода по методу деления пополам. Конечно, просто написать сценарий и запустить его. Однако трюк возникает, когда я хочу определить функцию, которая примет выражение, такое как x ** 2, как вход. Однако я сломал что-то вместе. Это похоже на работу, но затем в моем первом заявлении, в котором она жалуется, что она не может умножить функцию на функцию. Как я могу решить эту проблему? Я действительно пробовал делать домашнее задание по этой проблеме, прежде чем спрашивать и, к сожалению, не могу найти решение. Я просто хотел бы знать, как это сделать.Создайте функцию, которая принимает выражение как входной сигнал в python

from sympy.abc import x 

def bisect(f, a, b): 
    f = lambda x: f 
    f_a, f_b = f(a), f(b) 
    tol = 1e-4 
    count = 0 
    print '\t'.join(['Step' , 'a', 'b', 'c', 'f(c) ' , '(b-a)/2)']) 
    while (b-a)/float(2) > tol: 
     c = (a+b)/2 
     f_c = f(c) 
     print '\t'.join([str(count) , str(a) , str(b) , str(c), str((b-a)/float(2))]) 
     if f_a*f_c < 0: 
      b = c 
      f_b = f_c 
     else: 
      a = c 
      f_a = f_c 
     count = count + 1 
+0

Можете ли вы разобраться ваш отступы пожалуйста. Лучший способ, я думаю, решить то, что вы просите просто передать в f как лямбда - вы не можете передать выражение в качестве аргумента. –

ответ

0

Это то, что вам нужно знать?

>>> def demo(func): 
... for i in range(5): 
...  print func(float(i)) 
... 
>>> demo(lambda x: x**2 + 2*x - 5) 
-5.0 
-2.0 
3.0 
10.0 
19.0 

Вы также можете передать в функцию, созданную def, а также однострочника определенной с lambda. выше, является такой же, как

def foo(x): 
    return x**2 + 2*x - 5 

demo(foo) 

Другая вещь, которую вы могли бы хотеть знать, что

definition = "x**2 + 2*x - 5" # or read it from the user as text input 
demo(eval("lambda x: " + definition)) 

работы ...

обязательно предупреждения, «Eval зло», принимая Код Python от пользователя и его выполнение обычно считаются безопасным no-no-NO! Однако, если этот код запускается тем же пользователем, который экспериментирует с построением математических форм, от него не может быть большого вреда. Он не может сделать ничего хуже, чем то, что он мог сделать с python в командной строке. Если бы вы делали что-либо подобное на веб-сервере или тому подобное, я опасался за вашу работу и будущие перспективы!

+0

Большое вам спасибо, я очень ценю ваше решение и помощь, а также предупреждаю обо всех будущих целях. К счастью, я студент, изучающий прикладную математику, и до сих пор только бакалавриат. Таким образом, python - это просто моя альтернатива Matlab .... который он абсолютно разрушает. Вспомните эту аккуратную рифму. –

0

Давайте предположим, что вы создали выражение для функции f с помощью sympy:

f = x**2-0.1 

Ваша bisect функция будет работать, если вы измените lambda определение:

def bisect(fexpr, a, b): 
    f = lambda xval: fexpr.subs(x,xval) 
    f_a, f_b = f(a), f(b) 
    ...