2011-12-02 9 views
9

En general, Mathematica asume siempre el caso más general, es decir, si fijo una funcióntrabajar con funciones reales en Mathematica

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

y quiero calcular su norma Norm[a[s]], por ejemplo, devolverá:

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

Sin embargo, si sé que todos ai[s] son reales, puedo invocar:

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

que devolverá:

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

¿Qué es lo que espero.

problema ocurre cuando se trata de, por ejemplo, se derivan a[s] y luego (tenga en cuenta la D):

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

vuelve una consecuencia que implica valores absolutos - procedentes de la suposición de que los números pueden ser imaginario.

¿Cuál es la manera de superar este problema? Quiero definir una función de valor real y trabajar con ella como tal. Es decir, por ejemplo, quiero que sus derivados sean reales.

+0

La respuesta he elegido no es el más general, pero primero se resolvió mi problema. En segundo lugar, me enseñó la moral "debes cuidar tu código". ¡Gracias por todas las otras respuestas agradables y útiles! – Dror

Respuesta

7

Yo usaría una función personalizada en su lugar, p.

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

Entonces

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

Advertencia: no tengo mucha experiencia práctica con esto, por lo que los ejemplos siguientes no se prueban a fondo (es decir, no sé si los supuestos demasiado generales pueden romper cualquier cosa que yo no he pensado).


Se puede utilizar para definir $Assumptions supuestos permanentes:

podríamos decir que todos a1[s], a2[s], a3[s] son reales:

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

Pero si tiene por ejemplo a1[x] (no a1[s]), entonces no funcionará. Para que podamos mejorar un poco el uso de patrones:

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

o simplemente decir que todos los valores de a[_] son reales:

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

o incluso ser valiente y decir que todo es real:

$Assumptions = {_ \[Element] Reals} 

(me pregunto lo que este se rompe)

AppendTo es útil para agregando a $Assumptions y manteniendo suposiciones previas.

Al igual que Assuming, esto sólo funcionará para funciones como Simplify o Integrate que tiene una opción Assumtpions. D no es una función tal.


Algunas funciones como Reduce, FindInstance, etc. tienen una opción para trabajar sólo en el dominio de reales, enteros, etc., lo que supone que todas las expresiones y subexpresiones con las que trabajan son reales.


ComplexExpand[] ya veces FunctionExpand[] también pueden ser útiles en situaciones similares (pero no realmente aquí). Ejemplos: ComplexExpand[Abs[z]^2, TargetFunctions -> {Sign}] y FunctionExpand[Abs'[x], Assumptions -> {x \[Element] Reals}].


general, por lo que yo sé, no hay matemática forma de saber Mathematica que una variable es real. Solo es posible hacerlo de forma formal, utilizando patrones, y solo para ciertas funciones que tienen la opción Assumptions. Por "formal" quiero decir que si dices que a[x] es real, no sabrá automáticamente que a'[x] también es real.

+1

"... no hay una forma matemática de decirle a Mathematica que una variable es real ..." OMI, este ha sido (y sigue siendo) un gran punto de frustración/confusión para mí. Uno puede asignar la "Constante" de Atributo a un Símbolo e información sobre Dt, por ejemplo, hace que parezca que configurar dicho Atributo es una gran manera de informar a Mathematica de su intento matemático. Yo * realmente * deseo que haya Atributos que le permitan, cuando sea conveniente, especificar Real, PositiveReal, NonNegativeReal, NegativeReal, etc; quizás incluso NonConstant (pensando en la construcción de modelos). Los supuestos/simplificación pueden ser torpes. – telefunkenvf14

2

En este caso, podría usar ComplexExpand, aunque con una solución alternativa. Por ejemplo

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

vuelve

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

note que al hacer algo como ComplexExpand[Norm[a'[s], 2]] (o, de hecho ComplexExpand[Norm[a'[s], p]] donde p es un número racional) no funciona por alguna razón.

+1

Eso es extraño. También puede usar 'TargetFunctions -> {Sign}' con lo cual quiero decir "no use' Abs' "y no" use 'Sign'". Entonces no hay necesidad de 'Norma [..., 2]'. – Szabolcs

2

Para versiones anteriores de Mathematica que solía ser un paquete adicional RealOnly que puso Mathematica en un modo de sólo reales. Hay una versión disponible en versiones posteriores y online con actualizaciones de compatibilidad mínimas. Reduce muchas situaciones a una única verdadera solución, pero no funciona para su caso Norm:

enter image description here