2010-03-17 18 views
1

J'essaye de faire une matrice tridiagonale de 100 x 100 avec 2 descendant la diagonale et -1 entourant les 2. Je peux faire une matrice tridiagonale avec seulement 1 dans les trois diagonales et l'addition de matrice de préforme pour obtenir ce que je veux, mais je veux savoir s'il y a un moyen de personnaliser les trois diagonales à ce que vous voulez. maplehelp ne répertorie aucun élément utile.maple 13 matrice tridiagonale aide

Répondre

3

La fonction Matrix du package LinearAlgebra peut être appelée avec un paramètre (init) qui est une fonction qui peut affecter une valeur à chaque entrée de la matrice en fonction de sa position.
Cela fonctionnerait:

f := (i, j) -> if i = j then 2 elif abs(i - j) = 1 then -1 else 0; end if; 
Matrix(100, f); 
1

LinearAlgebra [BandMatrix] fonctionne aussi (et sera plus rapide WAY), surtout si vous utilisez le stockage = bande [1]. Vous devriez probablement utiliser shape = symétrique aussi. Les solutions proposées

0

JMBR peuvent être adaptés au travail:

 
f := proc(i, j) 
    if i = j then 2 
    elif abs(i - j) = 1 then -1 
    else 0 
    end if 
end proc; 
Matrix(100, f); 

Aussi, je comprends votre commentaire que vous dire besoin plus tard pour détruire la nature de la matrice de la bande, ce qui vous empêche d'utiliser BandMatrix - est-ce pas? La solution la plus simple à cette question est d'envelopper l'appel BandMatrix dans un appel régulier Matrix, qui vous donnera une matrice que vous pouvez changer, vous auriez cependant aimé:

 Matrix(LinearAlgebra:-BandMatrix([1,2,1], 1, 100));
1

Les réponses impliquant une fonction d'initialisation f fera O (n^2) travaille pour la matrice nxn carrée. Idéalement, cette tâche devrait être O (n), puisqu'il y a juste moins de 3 * n entrées à remplir. Supposons aussi que vous vouliez une matrice résultante sans fonction de stockage ou d'indexation spéciale (par exemple bande) (de sorte que vous puissiez écrire arbitrairement dans n'importe quelle partie arbitrairement). Et supposons aussi que vous ne voulez pas contourner un tel problème en enveloppant la structure de bande Matrix avec un autre appel Matrix() générique qui doublerait la mémoire temporaire utilisée et produirait des déchets à collectionner.

Voici deux façons de le faire (sans appliquer f à chaque entrée d'une manière O (n^2), ou en utilisant une do-loop séparée). Le premier implique la création des trois bandes en tant que temps (qui est la poubelle à recueillir, mais au moins pas la taille de n^2). M: = Matrice (100, [[- 1 99 $], [2 100 $], [- 1 99 $]], balayage = bande [1,1]); Cette seconde manière utilise une routine qui marche M et le remplit avec seulement les trois valeurs scalaires (donc pas besoin des 3 listes de bandes explicitement).

M: = Matrice (100):

ArrayTools: -fill (100,2, M, 0100 + 1);

ArrayTools: -Fill (99, -1, M, 1,100 + 1);

ArrayTools: -Remplissage (99, -1, M, 100,100 + 1);

Notez que ArrayTools: -Fill est une routine externe compilée, et peut donc en principe être plus rapide qu'une méthode interprétée en langage Maple (correct). Ce serait particulièrement rapide pour une matrice M avec un type de données matériel tel que 'float [8]'. Par ailleurs, la raison pour laquelle la procédure de flèche ci-dessus a échoué avec l'erreur "procédure de flèche invalide" est probable qu'il a été entré en mode 2D Math. L'analyseur mathématique 2D de Maple 13 ne comprend pas la syntaxe if ... then ... end comme le corps d'un opérateur de flèche.Alternatives (en dehors de l'écriture f comme un proc comme quelqu'un d'autre a répondu) est d'entrer f (inédit) en mode notation 1D Maple, ou d'éditer f pour utiliser le formulaire opérateur if. Peut-être la forme d'opérateur de if nécessite ici un if imbriqué pour gérer le elif. Par exemple,

f := (i,j) -> `if`(i=j,2,`if`(abs(i-j)=1,-1,0)); 
Matrix(100,f);