2011-12-02 10 views
9

Ogólnie Mathematica zawsze zakłada najbardziej ogólny przypadek, to znaczy, jeśli ustawić funkcjęPraca z rzeczywistych funkcji w Mathematica

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

i chcesz obliczyć swoją normę Norm[a[s]], na przykład, będzie to powrót:

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

Jednakże, jeśli wiem, że wszystko ai[s] są prawdziwe, mogę wywołać:

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

, który zwróci:

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

Tego właśnie oczekuję.

Problem dzieje się podczas próby, na przykład, a następnie czerpać a[s] (zauważ D):

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

Powraca znowu wynik obejmujący wartości absolutnych - pochodzące z założenia, że ​​liczby mogą być zmyślone.

Jaki jest sposób na przezwyciężenie tego problemu? Chcę zdefiniować funkcję o wartościach rzeczywistych i pracować z nią jako taką. Na przykład chcę, aby jej pochodne były prawdziwe.

+0

Odpowiedź wybrałem nie jest najbardziej ogólnym jeden, ale najpierw rozwiązać mój problem. Po drugie, nauczyłem mnie moralnego "powinieneś zająć się swoim kodem". Dzięki za wszystkie inne miłe i pomocne odpowiedzi! – Dror

Odpowiedz

7

Zamiast tego użyłbym funkcji niestandardowej, np.

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

Następnie

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

Ostrzeżenie: nie mam dużo praktyczne doświadczenia z tym, więc poniższe przykłady nie są dokładnie badane (tzn ja nie wiem, czy zbyt ogólne założenia może złamać niczego nie myślałem o).


Można użyć $Assumptions zdefiniować stałe założenia:

Moglibyśmy powiedzieć, że wszystkie a1[s], a2[s], a3[s] są reals:

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

Ale jeśli masz na przykład a1[x] (nie a1[s]), to nie zadziała. Więc może poprawić trochę stosując wzory:

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

lub po prostu powiedzieć, że wszystkie wartości a[_] są prawdziwe:

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

Albo nawet być śmiały i powiedzieć, że wszystko jest prawdziwe:

$Assumptions = {_ \[Element] Reals} 

(Zastanawiam się, co się z tym wiąże)

AppendTo jest przydatne dla dodając do $Assumptions i zachowując poprzednie założenia.

Podobnie jak Assuming, działa to tylko dla funkcji takich jak Simplify lub Integrate, które mają opcję Assumtpions. D nie jest taką funkcją.


Niektóre funkcje, takie jak Reduce, FindInstance itp mieć możliwość pracy tylko w domenie Real, liczb itp, która zakłada, że ​​wszystkie wyrażenia i Podwyrażenia którymi pracują są prawdziwe.


ComplexExpand[] i czasami FunctionExpand[] mogą być również przydatne w podobnych sytuacjach (ale naprawdę nie tutaj). Przykłady: ComplexExpand[Abs[z]^2, TargetFunctions -> {Sign}] i FunctionExpand[Abs'[x], Assumptions -> {x \[Element] Reals}].


Ogólnie, o ile mi wiadomo, nie ma matematyczny sposób powiedzieć Mathematica, że ​​zmienna jest prawdziwe. Jest to możliwe tylko w sposób formalny, z wykorzystaniem wzorców i tylko dla niektórych funkcji, które mają opcję Assumptions. Przez "formalny" mam na myśli to, że jeśli powiesz mu, że a[x] jest prawdziwy, nie będzie automatycznie wiedział, że a'[x] jest również prawdziwy.

+1

"... nie ma matematycznego sposobu, aby powiedzieć Mathematice, że zmienna jest prawdziwa ..." IMO, to był (i nadal będzie) główny punkt frustracji/dezorientacji dla mnie. Można przypisać atrybut "stały" do symbolu, a na przykład informacja na Dt sprawia, że ​​wydaje się, że ustawienie takiego atrybutu jest świetnym sposobem informowania Mathematica o twoim matematycznym zamyśle. Ja * naprawdę * chciałbym, aby były Atrybuty pozwalające, gdy jest to pożądane, określić Real, PositiveReal, NonNegativeReal, NegativeReal, etc; być może nawet NonConstant (myślenie o budowaniu modelu). Założenia/uproszczenia mogą być nieporęczne. – telefunkenvf14

2

Można użyć w tym przypadku ComplexExpand, ale z obejściem. Dla przykładu

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

powraca

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

pamiętać, że robi coś podobnego ComplexExpand[Norm[a'[s], 2]] (lub też ComplexExpand[Norm[a'[s], p]] gdzie p jest liczbą wymierną) nie działa z jakiegoś powodu.

+1

To dziwne. Możesz również użyć 'TargetFunctions -> {Sign}', co oznacza "nie używaj' Abs' ", a nie" use 'Sign'". Wtedy nie ma potrzeby "Norm [..., 2]". – Szabolcs

2

Dla starszych wersjach Mathematica znajdowały się dodatek pakiet RealOnly pakowanej Mathematica w trybie Real-only. Dostępna jest wersja w późniejszych wersjach i online z minimalnymi ulepszeniami kompatybilności. Zmniejsza to wiele sytuacji do rzeczywistego jedyne rozwiązanie, ale nie działa w Twoim przypadku Norm:

enter image description here