Page 1 of 2

[Mini-Challenge Basic #5] : Matrice hessienne

Unread postPosted: 03 Jul 2014, 20:02
by Levak
Keskecé ?
RTFW : http://fr.wikipedia.org/wiki/Matrice_hessienne
$mathjax$H_{ij}(f) = \frac{\partial^2 f}{\partial x_i\partial x_j}$mathjax$


J'ai pas fait spé math !
Moi non plus. Si ça vous gène, dites-vous simplement que c'est la dérivée d'une dérivée.

Fonction à coder : hess(v, eq) := ...
Arguments :
  • v : Matrice ou liste (verticale ou horizontale, comme vous voulez) à 1 dimension donnant la liste des variables sur lesquelles dériver.
  • eq : La fonction (sous forme d'expression).
Valeur de retour : Matrice hessienne de eq

Exemple :
Code: Select all
hess(| e1 |, e1² + e2² + e3²) = | 2 0 0 |
     | e2 |                     | 0 2 0 |
     | e3 |                     | 0 0 2 |


Interdit à...
  • Libs externes
  • Prgm
  • Func

Gné ?
C'est facile ... quand on connait le truc.
Un indice :
fortytwo(x):=list@>mat(seq(i*42, i, 1, 42))

Evaluation du vainqueur
21 caractères :
Code: Select all
hess_(eq) := eq+42
             |---|
hess(v, eq) := sum({hess_(eq)})
               |--------------|

Re: [Mini-Challenge Basic #5] : Matrice hessienne

Unread postPosted: 03 Jul 2014, 23:54
by pierrotdu18
Heu... est ce que le nombre de variables de la fonction est défini à 3 ou on doit pouvoir gérer tous les cas ?...
Car j'ai une solution (quoi qu'un peu triviale) pour un nombre défini de variables, mais si on veut que ça marche pour n'importe quel nombre de variables, je crois qu'il va falloir traficoter des strings...
Ma solution, pour 3 variables, fait 57 caractères et a l'air de marcher car elle renvoie bien la matrice que tu as donnée en exemple... voili voilou, j'attends plus d'explications avant de poster ma (première) réponse ;)

EDIT : Ouuups j'avais oublié qu'on passait une expression en argument :p
Donc j'ai une solution qui fonctionne ! ;) Je l'ai essayée avec plusieurs fonctions et elle marche

Par contre je ne posterai le code que plus tard sinon c'est pas drôle, en tout cas, elle fait 50 caractères ;)

EDIT2 : Je crois, d'ailleurs, que c'est la seule solution......

Re: [Mini-Challenge Basic #5] : Matrice hessienne

Unread postPosted: 04 Jul 2014, 00:04
by Levak
pierrotdu18 wrote:Heu... est ce que le nombre de variables de la fonction est défini à 3 ou on doit pouvoir gérer tous les cas ?...

La dimension de la matrice hessienne est carrée dépendant de la taille de v; Donc non, ce n'est pas limité à 3.

Re: [Mini-Challenge Basic #5] : Matrice hessienne

Unread postPosted: 04 Jul 2014, 00:06
by pierrotdu18
Bon bah voilà, à part en gagnant de la place avec le nom de la variable "eq" qui pourrait être remplacé par "e", je ne vois pas comment on peut optimiser ça...

Re: [Mini-Challenge Basic #5] : Matrice hessienne

Unread postPosted: 04 Jul 2014, 00:08
by pierrotdu18
Bon, finalement c'est tellement trivial que je poste ma solution... :

Code: Select all
hess(v,eq):=seq(seq(((eq,v[j]),v[i]),j,1,dim(v)),i,1,dim(v))


Image

Re: [Mini-Challenge Basic #5] : Matrice hessienne

Unread postPosted: 04 Jul 2014, 00:24
by Levak
pierrotdu18 wrote:
Code: Select all
hess(v,eq):=seq(seq(((eq,v[j]),v[i]),j,1,dim(v)),i,1,dim(v))


Je pensais pas que ma solution, qui est plus belle, faisait exactement le même nombre de caractères (50) ...

Re: [Mini-Challenge Basic #5] : Matrice hessienne

Unread postPosted: 04 Jul 2014, 00:28
by pierrotdu18
Bon bah exæquo alors ^^
Tu nous montre ce que tu as fait? :)

Re: [Mini-Challenge Basic #5] : Matrice hessienne

Unread postPosted: 04 Jul 2014, 05:46
by Levak
Code: Select all
hess(v,eq):=constructMat(((eq,v[j]),v[i]),i,j,dim(v),dim(v))

Re: [Mini-Challenge Basic #5] : Matrice hessienne

Unread postPosted: 04 Jul 2014, 11:46
by Adriweb
Quelle est la plus rapide, maintenant ? :P

Re: [Mini-Challenge Basic #5] : Matrice hessienne

Unread postPosted: 06 Jul 2014, 11:36
by pierrotdu18
Je vais faire des tests :)

(mais Levak n'avait pas parlé de vitesse dans ses critères d'évaluation :p (je dis ça parce qu'il n'utilise qu'une fonction, faite pour, et que donc, ça sera sûrement plus rapide :D (qui sait ^^)))