2017-06-03 7 views
0

j'ai écrit une méthode de bissection dans Octave, mais il ne peut pas consommer une autre fonction ..appel Octave une fonction comme variable d'une autre fonction

Mon code de méthode bissectrice est comme:

function[x,b] = bisection(f,a,b) 

    t = 10e-8 

    while abs(b-a) > t; 
    c = (a+b)/2; 

    if f(a) * f(b) <= 0 
     a = a; 
     b = c; 
    else 
     b = b; 
     a = c 
    endif 
    endwhile 

    x = (a+b)/2 
endfunction 

Et je ont déjà un fichier f1.m:

function y = f1(x) 
    y = x^2 - 4; 
endfunction 

Mais quand je l'appelle [x,v] = bisection[f1,0,5], je reçois:

>> [t,v] = bisection(f1,0,5) 
    error: 'x' undefined near line 2 column 5 
    error: called from 
      f1 at line 2 column 3 
    error: evaluating argument list element number 1 
+0

Où est l'argument 'x' de la fonction' f1' dans votre appel? –

+0

notez que ce code est spécifique à l'octave btw.matlab ne le fera pas; vous pouvez soit supprimer le tag matlab, soit modifier le code pour le rendre compatible matlab –

Répondre

1

ce que vous voulez est de passer un pointeur vers f1 à votre fonction bisection donc le bon choix serait

[t,v] = bisection(@f1,0,5) 

qui sort:

t = 1.0000e-07 
a = 0.62500 
a = 0.93750 
a = 1.0938 
a = 1.1719 
a = 1.2109 
a = 1.2305 
a = 1.2402 
a = 1.2451 
a = 1.2476 
a = 1.2488 
a = 1.2494 
a = 1.2497 
a = 1.2498 
a = 1.2499 
a = 1.2500 
a = 1.2500 
a = 1.2500 
a = 1.2500 
a = 1.2500 
a = 1.2500 
a = 1.2500 
a = 1.2500 
a = 1.2500 
a = 1.2500 
x = 1.2500 
t = 1.2500 
v = 1.2500 
1

Andy vous a donné la réponse sur la façon de répare ça. Je voudrais juste ajouter pourquoi vous obtenez cette erreur et ce que cela signifie. Considérez la session octave suivante:

octave:1> function Out = g1(x); Out = x+5; end 
octave:2> function Out = g2(); Out = 10;end 
octave:3> 
octave:3> g2 
ans = 10 
octave:4> g1 
error: 'x' undefined near line 1 column 29 
error: called from 
    g1 at line 1 column 27 

à savoir, lorsque vous écrivez g1 ou g2 ici, ceci est un appel de fonction réelle . L'appel à g2 réussit car g2 ne prend aucun argument; la syntaxe g2 est essentiellement équivalente à g2(). Toutefois, l'appel à g1 échoue, car g1 attend un argument, et nous n'en avons pas fourni.

Comparer avec:

octave:4> a = @g1; 
octave:5> b = @g2; 
octave:6> a 
a = @g1 
octave:7> a(1) 
ans = 6 
octave:8> b 
b = @g2 
octave:9> b() 
ans = 10 

où vous avez créé poignées à ces fonctions que vous pouvez capturer dans les variables et les arguments comme passer en fonctions. Ces poignées peuvent alors être appelées a(5) ou b()à l'intérieur de la fonction qui les a reçues en tant qu'arguments, ce qui revient à appeler les fonctions g1 et g2 d'origine.

Lorsque vous avez appelé bisection(f1,0,5), vous essentiellement appelé bisection(f1(),0,5), à savoir que vous avez demandé octave d'évaluer la fonction f1 sans passer aucun argument, et utiliser le résultat comme premier argument d'entrée à la fonction bisection. Puisque la fonction f1 est définie pour prendre un argument d'entrée et que vous n'en fournissiez aucune, octave se plaint que lorsqu'elle essaye d'évaluer y = x^2 - 4; selon la définition de f1, n'a pas été passée comme argument d'entrée et était donc indéfinie.

Par conséquent, pour passer une « fonction » comme un argument arbitraire qui peut être appelé à l'intérieur votre fonction bissectrice, vous devez passer une fonction poignée à la place, qui peut être créée en utilisant la syntaxe @f1. Lisez les "fonctions anonymes" sur la documentation octave (ou matlab).