2017-02-09 1 views
0

Je suis occupé à faire du code sur la méthode de bissection. Il est facile, bien sûr, d'écrire le script et de l'exécuter. Cependant, l'astuce intervient lorsque je veux définir une fonction qui prendra une expression telle que x ** 2 en entrée. J'ai mis au rancart quelque chose cependant. C'est en quelque sorte le travail accompli, mais à ma première déclaration if, il se plaint de ne pas pouvoir multiplier une fonction par une fonction. Comment pourrais-je résoudre ce problème aussi? J'ai vraiment essayé de faire mes devoirs sur ce problème avant de demander et malheureusement je ne trouve pas la solution. J'aimerais juste savoir comment faire cela.Créer une fonction qui accepte une expression comme une entrée en 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

Pouvez-vous trier votre indentation s'il vous plaît. La meilleure façon, je pense, de résoudre ce que vous demandez de simplement passer en tant que lambda - vous ne pouvez pas passer dans une expression comme argument. –

Répondre

0

Est-ce ce que vous devez savoir?

>>> 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 

Vous pouvez également passer dans une fonction créée avec def ainsi qu'une seule ligne définie par lambda. ce qui précède est le même que

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

demo(foo) 

L'autre chose que vous pourriez vouloir savoir est que

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

œuvres ...

avertissement obligatoire, "eval est mal", accepter Le code Python d'un utilisateur et son exécution est généralement considéré comme une sécurité non-non-NON! Cependant, si ce code est exécuté par le même utilisateur qui expérimente avec des formes mathématiques de traçage, aucun grand mal ne peut en découler. Il ne peut rien faire de pire que ce qu'il pouvait faire avec python sur la ligne de commande. Si vous deviez faire quelque chose comme ça dans un serveur web ou autre, je craindrais pour votre emploi et vos perspectives d'avenir!

+0

Merci beaucoup, j'apprécie vraiment votre solution et votre aide ainsi que de m'avertir à des fins futures. Heureusement, je suis un étudiant en mathématiques appliquées et je ne suis encore que premier cycle. Donc python est juste mon alternative au matlab .... qu'il détruit absolument. Se souviendra de cette rime soignée cependant. –

0

Supposons que vous avez créé une expression pour la fonction f utilisant sympy:

f = x**2-0.1 

Votre fonction bisect fonctionnera si vous modifiez la définition lambda:

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