2011-12-02 20 views
9

In generale, Mathematica assume sempre il caso più generale, cioè, se ho impostato una funzioneLavorare con funzioni reali in matematica

a[s_]:={a1[s],a2[s],a3[s]} 

e voglio calcolare la sua norma Norm[a[s]], per esempio, verrà restituito:

Sqrt[Abs[a1[s]]^2 + Abs[a2[s]]^2 + Abs[a3[s]]^2] 

Tuttavia, se so che tutto ai[s] sono reali, posso richiamare:

Assuming[{a1[s], a2[s], a3[s]} \[Element] Reals, Simplify[Norm[a[s]]]] 

che restituirà:

Sqrt[a1[s]^2 + a2[s]^2 + a3[s]^2] 

Quale è quello che mi aspetto.

problema si verifica quando si tenta di, per esempio, derivano a[s] e poi (nota la D):

Assuming[{a1[s], a2[s], a3[s]} \[Element] Reals, Simplify[Norm[D[a[s],s]]]] 

ritorni nuovamente conseguenza coinvolge valori assoluti - provengono dal presupposto che i numeri possono essere immaginari.

Qual è il modo per superare questo problema? Voglio definire una funzione a valori reali e lavorarci come tale. Ad esempio, voglio che i suoi derivati ​​siano reali.

+0

La risposta che ho scelto non è quello più generale, ma prima ha risolto il mio problema. In secondo luogo, mi ha insegnato la morale "dovresti prenderti cura del tuo codice". Grazie per tutte le altre risposte gentili e utili! – Dror

risposta

7

Vorrei utilizzare invece una funzione personalizzata, ad es.

vecNorm[vec_?VectorQ] := Sqrt[ vec.vec ] 

Poi

In[20]:= vecNorm[D[{a1[s], a2[s], a3[s]}, s]] 

Out[20]= Sqrt[ 
Derivative[1][a1][s]^2 + Derivative[1][a2][s]^2 + 
Derivative[1][a3][s]^2] 
6

Attenzione: non ho molta esperienza pratica con questo, quindi gli esempi qui sotto non sono accuratamente testati (vale a dire non so se le ipotesi troppo generali possono rompere qualcosa che non ho pensato).


È possibile utilizzare $Assumptions per definire ipotesi permanenti:

Potremmo dire che tutti a1[s], a2[s], a3[s] sono reali:

$Assumptions = {(a1[s] | a2[s] | a3[s]) \[Element] Reals} 

Ma se avete ad esempio a1[x] (non a1[s]), quindi non funzionerà. Così possiamo migliorarlo un po 'utilizzando modelli:

$Assumptions = {(a1[_] | a2[_] | a3[_]) \[Element] Reals} 

o anche solo dire che tutti i valori di a[_] sono reali:

$Assumptions = {a[_] \[Element] Reals} 

O anche essere coraggioso e dire che tutto è reale:

$Assumptions = {_ \[Element] Reals} 

(mi chiedo che cosa si rompe)

AppendTo è utile per aggiungendo a $Assumptions e mantenendo le ipotesi precedenti.

Proprio come Assuming, questo funziona solo per funzioni come Simplify o Integrate con opzione Assumtpions. D non è una funzione del genere.


Alcune funzioni come Reduce, FindInstance, ecc hanno la possibilità di lavorare solo sul dominio del Real, interi, ecc, che presuppone che tutte le espressioni e sottoespressioni con cui lavorano sono reali.


ComplexExpand[] e talvolta FunctionExpand[] può anche essere utile in situazioni simili (ma non proprio qui). Esempi: ComplexExpand[Abs[z]^2, TargetFunctions -> {Sign}] e FunctionExpand[Abs'[x], Assumptions -> {x \[Element] Reals}].


Generalmente, per quanto ne so, non c'è matematico modo per dire Mathematica che una variabile è reale. È possibile farlo in modo formale, utilizzando modelli e solo per determinate funzioni che dispongono dell'opzione Assumptions. Con "formale" intendo che se si dice che a[x] è reale, non si saprà automaticamente che anche a'[x] è reale.

+1

"... non esiste un modo matematico per dire a Mathematica che una variabile è reale ..." IMO, questo è stato (e continua ad essere) un punto importante di frustrazione/confusione per me. Si può assegnare l'attributo 'Costante' a un simbolo e le informazioni su Dt, ad esempio, fanno sembrare che l'impostazione di tale attributo sia un ottimo modo per informare Mathematica del proprio intento matematico. Vorrei davvero che ci fossero degli Attributi che ti permettessero, quando desiderabile, di specificare Real, PositiveReal, NonNegativeReal, NegativeReal, etc; forse anche NonConstant (pensando alla costruzione di un modello). Le supposizioni/semplificazioni possono essere goffe. – telefunkenvf14

2

In questo caso è possibile utilizzare ComplexExpand anche se con una soluzione alternativa. Ad esempio

ComplexExpand[Norm[a'[s], t]] /. t -> 2 

rendimenti

Sqrt[Derivative[1][a1][s]^2 + Derivative[1][a2][s]^2 + Derivative[1][a3][s]^2] 

Nota che facendo qualcosa di simile ComplexExpand[Norm[a'[s], 2]] (o effettivamente ComplexExpand[Norm[a'[s], p]] dove p è un numero razionale) non funziona per qualche motivo.

+1

È strano. Puoi anche usare 'TargetFunctions -> {Sign}' con cui intendo "non usare' Abs' "e non" usa 'Sign'". Quindi non c'è bisogno di 'Norm [..., 2]'. – Szabolcs

2

Per le versioni più vecchie di Mathematica Ci deve essere utilizzato un pacchetto add-on RealOnly che ha messo Mathematica in una modalità reali solo. Esiste una versione disponibile nelle versioni successive e online con aggiornamenti minimi di compatibilità. Riduce molte situazioni ad un reale unica soluzione, ma non funziona per il vostro Norm caso:

enter image description here