2017-01-24 3 views
4

Начну с простого вопроса Maxima, ответ на который может дать ответ на фактическую проблему, с которой я сталкиваюсь.Невычисление числового выражения в максимуме

Связанный простой вопрос: Как я могу получить максимальные значения для расчета: bfloat ((1 +% i)^0.3); Может ли быть опция переменной, которая может быть установлена ​​так, чтобы это оценивалось на комплексное число?

Актуальный вопрос: При оценке приближений для численного интегрирования времени для методов конечных элементов для этой цели я использую спектральный анализ, требующий вычисления собственных значений матрицы 4 × 4. Эта матрица «cav» также вычисляется в пределах максимумов, используя некоторые из возможностей алгебры максимумов, но поддерживая числовые значения, так что матрица является полностью численной, т. Е. Не содержит переменных. Я вычислил собственные значения с Mathematica и возвращает 4 реальных собственных значения. Однако Maxima вычисляет ужасно сложные выражения для этого случая, которые, по-видимому, не «знают», как упростить, даже численно, как «bigfloat». Возможно, эта проблема возникает из-за того, что Maxima сначала аппроксимирует матрицу «cac» рациональными числами (т. Е. Фракциями), а затем пытается полностью решить проблему, вместо того, чтобы просто использовать численные вычисления «bigfloat». Я могу изменить это?

Обратите внимание, что если вы только изменяете входное значение gzv, чтобы сказать 0.5, он отлично работает и возвращает числовые значения сложных собственных значений.

Включая код, указанный ниже. Обратите внимание, что весь код до «cav: subst (vs, ca) $» предназначен только для определения матрицы cav и, кажется, работает нормально. Именно в нескольких утверждениях после этого он не может вычислить числовые значения для собственных значений.

v1:v0+ (1-gg)*a0+gg*a1$ 
d1:d0+v0+(1/2-gb)*a0+gb*a1$ 
obf:a1+(1+ga)*(w^2*d1 + 2*gz*w*(d1-d0)) - 
      ga *(w^2*d0 + 2*gz*w*(d0-g0))$ 
obf:expand(obf)$ 
cd:subst([a1=1,d0=0,v0=0,a0=0,g0=0],obf)$ 
fd:subst([a1=0,d0=1,v0=0,a0=0,g0=0],obf)$ 
fv:subst([a1=0,d0=0,v0=1,a0=0,g0=0],obf)$ 
fa:subst([a1=0,d0=0,v0=0,a0=1,g0=0],obf)$ 
fg:subst([a1=0,d0=0,v0=0,a0=0,g0=1],obf)$ 
f:[fd,fv,fa,fg]$ 
cad1:expand(cd*[1,1,1/2-gb,0] - gb*f)$ 
cad2:expand(cd*[0,1,1-gg,0] - gg*f)$ 
cad3:expand(-f)$ 
cad4:[cd,0,0,0]$ 
cad:matrix(cad1,cad2,cad3,cad4)$ 
gav:-0.05$ 
ggv:1/2-gav$ 
gbv:(ggv+1/2)^2/4$ 
gzv:1.1$ 
dt:0.01$ 
wv:bfloat(dt*2*%pi)$ 
vs:[ga=gav,gg=ggv,gb=gbv,gz=gzv,w=wv]$ 
cav:subst(vs,ca)$ 
cav:bfloat(cav)$ 
evam:eigenvalues(cav)$ 
evam:bfloat(evam)$ 
eva:evam[1]$ 

ответ

2

Основная проблема здесь состоит в том, что Maxima пытается довольно трудно сделать вычисления точной, и это трудно сказать ему, чтобы ослабить и дать неточные результаты.

Есть ошибки в коде, который вы уже разместили выше? У вас есть cav:subst(vs,ca), но ca не определен. Это должно быть cav:subst(vs,cad)?

Для короткой задачи, как правило, rectform может упростить сложные выражения для чего-то более полезного:

(%i58) rectform (bfloat((1+%i)^0.3)); 
`rat' replaced 1.0B0 by 1/1 = 1.0B0 
(%o58)  2.59023849130283b-1 %i + 1.078911979230303b0 

О долгосрочной задаче, если с заданной точностью (т.е. обычные поплавками, не bigfloats), является приемлемой для вас, то вы можете использовать функцию LAPACK dgeev для вычисления собственных значений и/или собственных векторов.

(%i51) load (lapack); 
<bunch of messages here> 
(%o51) /usr/share/maxima/5.39.0/share/lapack/lapack.mac 
(%i52) dgeev (cav); 
(%o52) [[- 0.02759949957202372, 0.06804641655485913, 0.997993508502892, 0.928429191717788], false, false] 

Если вам действительно нужна переменная точность, я не знаю, что попробовать. В принципе, можно переработать код LAPACK для работы с плавающей запятой переменной точности, но это существенная задача, и я не уверен в деталях.

+0

Большое спасибо, Роберт Додьер. Дгеев из лапака работал красиво, и точность, хотя и не переменная, кажется более чем достаточной из числа напечатанных цифр, и пример верности, полученный от «? Dgeev». Очень полезно иметь возможность делать численные и символические вычисления с одной и той же программой. Я искал способы вычисления собственных значений с Maxima, но не нашел альтернативу dgeev, которая, по крайней мере, была наиболее полезной. –

Смежные вопросы