Page 1 of 3

Methode de Hückel

Unread postPosted: 13 Dec 2013, 19:10
by AnttonC
Bonjour,

Je souhaite programmer un calcul qui est très utilisé en chimie théorique de base, la méthode de Hückel. Je n'ai trouvé aucun programme qui le faisait sur Ti-Nspire.
Ce programme prend comme argument une matrice carrée (de taille n) qui dépend d'une variable x : M(x)

Mon premier problème est tout simple : Peut on faire un programme qui prend comme paramètre une fonction ?
J'aimerais écrire huckel(M), ou encore mieux huckel(M(x),x).
J'obtiens "erreur : erreur d'argument" dans le premier cas, et
"l'argument doit être un nom de variable" au moment de la vérification dans le deuxième cas.

Ensuite, peut-on utiliser un vecteur-variable pour faire du calcul formel ? Autrement dit je voudrais résoudre un système de n équations (dont une non linéaire : condition de normalisation) à n inconnues, n étant défini par l'argument du programme (n:=dim(M(x))[1]).
Si ce n'est pas possible je ferai séparément les cas n=2,3,4

Voilà, j'espère que j'ai été assez clair, et que quelqu'un pourra répondre au moins à mon premier problème.
N'hésitez pas à me dire si je dois plus détailler le travail que doit faire le programme

Merci d'avance,

Antton

Re: Methode de Hückel

Unread postPosted: 14 Dec 2013, 10:29
by Lionel Debroux
Il me semble qu'une façon de passer une fonction en paramètre à une autre est d'utiliser une chaîne de caractères contenant l'expression de la fonction, puis la retraduire en expression avec expr().
Mais ça fait presque une décennie que je ne fais presque plus de TI-BASIC :)

Re: Methode de Hückel

Unread postPosted: 14 Dec 2013, 12:43
by AnttonC
Ok merci beaucoup je vais essayer ça, j'espère que ça va marcher avec une matrice.
Du coup il faut mettre des guillemets au moment d'utiliser le programme ?

Re: Methode de Hückel

Unread postPosted: 14 Dec 2013, 16:30
by AnToX98
Bonjour,

Il y a précisément deux sens du mot "fonctions" abordables sur nspire.

• Le premier, c'est une fonction programmable, quand tu crée un nouveau programme, tu peux choisir entre fonction et programme. Ainsi, la fonction sert à retourner une valeur avec return, ce qui peut être très utile. Pour mieux comprendre, voici une fonction qui me calcule le cube de n :

Code: Select all
Define cube(n)=
Func
  Return n^(3)
EndFunc


Cette fonction, tu peux très bien l'utiliser n'importe où, pour stocker le cube d'une variable dans cette variable par exemple :

Code: Select all
a:=cube(a)


• Le deuxième type de fonction, c'est la fonction mathématique, avec une variable.

Ainsi, pour définir la fonction f(x)=2x+2, j'écris :

Code: Select all
f(x):=2x+2


Avec celle ci, je peux calculer l'image de x par la fonction :

Code: Select all
f(3)=8

Re: Methode de Hückel

Unread postPosted: 15 Dec 2013, 15:33
by AnttonC
Bonjour,

Merci pour ces explications, en effet je n'étais pas très précis : Je parle de fonctions de type f(x)=5x(x-1) par exemple, et je voulais que mon programme prenne comme argument f ou f(x),x.

Mais ça a l'air possible en passant par une chaîne de caractère, même si je bloque encore.

Voilà un cas simple pour illustrer ce qui ne marche pas

Code: Select all
Define programme(chaine)
Prgm
Local f
Disp expr(chaine) \\ça marche
f(x):=expr(chaine)
Disp f(5) \\ça marche pas
EndPrgm

Quand je rentre programme("x^2"), il me renvoie bien le premier disp (l'expression de la fonction), mais il met "Erreur : L'argument doit être une chaine de caractère", et je n'ai pas mon 25. Par contre quand je fais à la main les deux dernières lignes ça marche.
Je suis assez embêté parce que l'argument est bien une chaine et que la calculatrice l'a compris puisqu'il donne le premier résultat...

Re: Methode de Hückel

Unread postPosted: 15 Dec 2013, 17:48
by Bisam
En fait, AntoX98, les deux types de fonctions que tu décris sont... la même chose !!
Tu peux très bien définir ta fonction "f" exactement de la même façon que ta fonction "cube" et vice-versa.
Il n'y a qu'un seul type de fonction en TI-Basic.

Malheureusement, on ne peut pas utiliser une fonction comme paramètre d'appel d'une autre fonction.
On peut cependant gruger en utilisant la méthode suggérée par Lionel... mais c'est un peu plus subtil à cause de l'évaluation tardive.
En effet, lors de la création de la fonction, RIEN n'est évalué. L'évaluation se fait lors de l'utilisation de la fonction. (Et donc dans ton cas, au moment de l'évaluation, "chaine" n'est pas une chaine de caractères, mais une variable non attribuée, ce qui provoque l'erreur)

Il faut donc ruser ainsi :
Code: Select all
Define truc(chaine,var)=
Func
Local f
expr( "f(" & var & "):=" & chaine )
...
EndFunc

Pour cela, il faut bien entendu que "chaine" soit une chaîne de caractères et donc écrite entre guillemets. Il faudra aussi faire attention aux erreurs de syntaxe éventuels... car il n'y a plus d'auto-correction dans une chaîne de caractères.

Re: Methode de Hückel

Unread postPosted: 15 Dec 2013, 18:19
by AnttonC
Ok j'ai compris merci beaucoup !
Par contre j'ai du modifier un peu
Code: Select all
Define programme(chaine,x)
Prgm
Local f
expr("f(x):=" & chaine)
Disp expr(chaine)
Disp f(5)
EndPrgm

Sinon var aurait du être une chaine.
La variable s'appellera toujours x, du coup j'aimerais enlever le deuxième argument et déclarer x dans le programme.

Enfin bon, ça marche, et je pense que pour mon deuxième problème je vais traiter à la main les systèmes à 2,3,4 inconnues parce que résoudre un système à n équations n inconnues (n étant une variable définie) je ne pense pas que ça soit programmable...

Merci beaucoup en tout cas !

Re: Methode de Hückel

Unread postPosted: 15 Dec 2013, 18:35
by Bisam
Si tu l'écris comme tu l'as fait, ton programme ne fonctionnera que si ta variable s'appelle "x" (et du coup, ça ne sert à rien de mettre un 2ème paramètre !), alors que le mien fonctionne quelque soit le nom de la variable.

Attention cependant à bien mettre plusieurs chaines de caractères... j'ai séparé pour que ce soit plus clair 2 posts plus haut.

Re: Methode de Hückel

Unread postPosted: 15 Dec 2013, 18:47
by AnToX98
Oui, c'est juste sauf que une fonction que l'on définit ainsi : f(x):=2x+2 n'est pas programmable, non ?
Sinon, je crois que pour que ça marche correctement, il faut remplacer f par f1 :

Code: Select all
expr( "f1(" & var & "):=" & chaine )

Re: Methode de Hückel

Unread postPosted: 15 Dec 2013, 18:59
by Bisam
Je ne comprends rien à ce que tu racontes, AntoX98 !
Qu'est-ce qu'une fonction "programmable" ?
Si tu veux dire qu'elle ne peut pas être éditée dans l'éditeur de programmes... et bien c'est simplement FAUX. Il suffit de l'ouvrir comme n'importe quelle autre fonction.

Quant à ta 2ème idée, de remplacer "f" par "f1", c'est non seulement farfelu (pourquoi l'un marcherait et pas l'autre ? tu peux bien nommer ta fonction comme tu le souhaites !) mais en plus ici cela conduira à une erreur car toutes les variables utilisées dans une fonction doivent être locales (même si ces variables sont elles-mêmes des fonctions) et seul f a été déclaré comme variable locale.