2013-10-03 3 views
0

Я загрузил Maple proc, который возвращает вектор (например, v) выражений и где каждое отдельное выражение находится в терминах других векторов (p, a) с символическими элементами. Например:Подставляя числовые значения в символический Maple Vector

> v := myProc(); 
> v[1]; 
p[2] + a[1] 
> v[2]; 
p[5] + a[3] + sqrt(a[1]) 
... 

Я хотел бы, чтобы иметь возможность оценить выражения в Векторе «V» после того, как генерируется путем присвоения числовых значений векторов «р» и «а», однако если определить вектор «а» и «р» следующим образом:

a := Vector(3,1): 
p := Vector(5,2): 

Я получаю результаты, в которых значение одного вектора Переоформлены но значения другого вектора не являются:

> v[1]; 
p[2] + 1 
> v[2]; 
p[5] + 1 + sqrt(1) 

Любое понимание сути этого вопроса будет оценено по достоинству. Я просматривал файлы Maple, соответствующие этому процессу, чтобы попытаться присвоить значения 'p' и 'a', прежде чем Vector 'v' вернет выражения, но это было относительно неудачно, поскольку я относительно новичок в Maple и многочисленные подпрограммы в основном proc, по-видимому, в конечном итоге требуют, чтобы символические векторы успешно возвращали Vector 'v'.

ответ

0

p[i] в записях в первом векторе, возвращаемом xearm, являются так называемыми беглыми местными жителями. Таким образом, у них есть другой адрес из записей вашего глобального p Vector, поэтому они не могут оценить, как вы ожидали.

Вы можете обойти это следующим образом.Заменить

v:=f[1]; 

по,

v:=f[1]; 
v:=convert(v,`global`); 

a[i] и b[i] в первый результат, возвращаемый xearm по всей видимости, будут индексироваться в глобальные имена a и b, и не имеют такой же вопрос, как сделайте p[i].

Использование надлежащим образом рабочего примера из моего более раннего ответа, здесь представляет собой проблемную версию, которая демонстрирует подобное поведение.

restart: 

myProc:=proc() 
     local w, p; 
     w:=Vector(2); 
     w[1]:=p[2] + a[1]; 
     w[2]:=p[5] + a[3] + sqrt(a[1]); 
     return w; 
    end proc: 

v:=myProc(): 

v[1]; 
          p[2] + a[1] 

v[2]; 
             (1/2) 
         p[5] + a[3] + a[1]  

a:=Vector(3,1): 
p:=Vector(5,2): 

v[1]; 
           p[2] + 1 

v[2]; 
           p[5] + 2 

v:=convert(v,`global`): 

v; 
           [3] 
           [ ] 
           [4] 
+0

Работает отлично! Огромное спасибо!!! – user2161810

0

Вы уверены, что p был успешно назначен в качестве ответа, вызвавшего звонок Vector(5,2)?

Следующие работы, для меня, как и ожидалось.

restart: 

myProc:=proc() 
      local w; 
      w:=Vector(2); 
      w[1]:=p[2] + a[1]; 
      w[2]:=p[5] + a[3] + sqrt(a[1]); 
      return w; 
     end proc: 

v:=myProc(): 

v[1]; 
          p[2] + a[1] 

v[2]; 
             (1/2) 
         p[5] + a[3] + a[1]  

a:=Vector(3,1): 
p:=Vector(5,2): 

v[1]; 
            3 

v[2]; 
            4 

я могу думать о некоторых хитрых способов написания myProc так, что он ведет себя, как вы описали, но они в основном довольно неестественно. Например, я могу разместить две пары котировок неоценки (две пары одиночных левых котировок) вокруг экземпляров p[5] и p[2] внутри тела myProc.

Что вы получите, если сразу же после запроса v[2] (и получить свой неожиданный выход с участием невычисленных индексируемых ссылок на p) вы затем выдать команду,

%; 

?

Что вы получите, если в проблемной точке, вы выдаете только команду,

p; 

?

Что вы получите, если в проблемной точке, вы выдаете команду,

map(eval,v); 

?

Вы можете указать URL-адрес источнику myProc?

+0

Файл pysub.zip на [ссылка] (http://signalingsystems.ucsd.edu/code/) содержит код Maple я работаю (основной файл xearm.mpl и читает procs from pysub.mpl, loadXearm.mpl, printvar.mpl). На листе я прочитал в xearm.mpl и выполнил «f: = xearm (« verbose »= true,« doUnsub »= false); и назначить "v: = f [1];" Что касается других вопросов: «map (eval, v)» возвращает ошибку, «p» возвращает символ «_p_» (прежде чем я назначу его числовому вектору), а «%» вернет точное выражение «v [2 ] ". Надеюсь, что все имеет смысл и спасибо за ваш вклад! – user2161810

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