如何从Octave / Matlab执行多行Maxima代码

时间:2015-01-25 17:22:06

标签: matlab octave maxima

我可以像这样从Octave执行Maxima代码并且它可以工作:

mm=maxima("diff(a*x^3-b*x^2+x+d,x,1)") 

但是如何执行多行命令?

下面的示例代码适用于Maxima

kill(all)$
numer:true$
ratprint:false$
angle_in_bits:3779$
total_fs:18136$
s:solve(angle_deg=(angle_in_bits/total_fs*360),angle_deg)$
round(s); 
[round(angle_deg)=75]

当我在Octave中尝试下面的代码时,我会收到语法错误

mm=maxima("kill(all)$
numer:true$
ratprint:false$
angle_in_bits:3779$
total_fs:18136$
s:solve(angle_deg=(angle_in_bits/total_fs*360),angle_deg)$
round(s);")

我得到的错误:

>>> mm=maxima("kill(all)$
numer:true$
ratprint:false$
angle_in_bits:3779$
total_fs:18136$
s:solve(angle_deg=(angle_in_bits/total_fs*360),angle_deg)$
round(s);")
error: unterminated character string constant
parse error:

  syntax error

>>> mm=maxima("kill(all)$
                        ^

>>> _ide_reload_variables_list( whos() );
error: 'numer' undefined near line 1 column 1
error: invalid base value in colon expression
error: 'ratprint' undefined near line 1 column 1
error: invalid base value in colon expression
parse error:

  syntax error

>>> angle_in_bits:3779$
                      ^

parse error:

  syntax error

>>> total_fs:18136$
                  ^

parse error:

  syntax error

>>> s:solve(angle_deg=(angle_in_bits/total_fs*360),angle_deg)$
                                                             ^

error: unterminated character string constant
parse error:

  syntax error

>>> round(s);")
              ^

3 个答案:

答案 0 :(得分:2)

感谢Fred Senese和rayryeng的协助。

我知道有人可能需要这个,所以这里是一些示例代码。这段代码允许您直接从八度音程访问maxima的符号解算器(允许您执行多行maxima命令)。由于八度音程没有一个好的符号解算器,但这对另一个人来说会派上用场。

mm=maxima("(kill(all), numer:true, ratprint:false, angle_in_bits:3779, total_fs:18136, s:solve(angle_deg=(angle_in_bits/total_fs*360),angle_deg),(s))")
%mm = '[angle_deg = 75.01323334803705]';

[si ei xt mt] = regexp(mm, '(\d)*(\.)?(\d)*');
number = str2num(mt{1})

>>>number =  75.013

答案 1 :(得分:1)

我在这里假设您使用的是QtOctave,我猜测它是通过Google搜索您的错误消息“_ide_reload_variables_list(whos());” 如果不是这样,以下任何一项都不适用于您的问题。

在提示符下键入help maxima会将我指向一个文件/usr/share/qtoctave/scripts_octave/maxima.m 有了这个内容:

function result=maxima(command)
in="";
in=sprintf("echo \"string(%s);\"|maxima --very-quiet", command);
[status,result]=system(in);
%if(status!=0) result=""; endif;
result = deblank ( strjust (   strrep (result, "%", "")  ,"left") ); 
endfunction

这告诉我,maxima是通过octave的函数system以非常特殊的方式调用的,不允许在maxima中使用多个命令。

以下面的方式修改in的分配将允许您现在使用命令maxima的单元格数组调用函数maxima({command_1,command_2}),其中command_i是字符串。

in=['echo ', sprintf('\"%s;\" ',command{:}), '| maxima --very-quiet'];

请注意,函数system仍然只返回一个输出,即由maxima发送到标准输出的输出。

This也可能对您感兴趣,因为它描述了八度音阶与子过程交互的方法。

我不确定这是否有用,因为我认为我提供的修改只是非常肤浅的用法,但也许它可以帮助你更好地理解八度音程在做什么,如果你告诉它maxima(something)。它帮助了我。

最后但并非最不重要的是据我所知,octave(或matlab)和maxima之间没有真正的接口。如果我错了,我希望有人会纠正我。

答案 2 :(得分:0)

我的Linux笔记本电脑(Ubuntu)中装有Octave和Maxima。 Octave中存在系统功能,可用于运行终端命令。

在终端中,可以使用管道来调用最大值函数 (将quit();添加到maxima命令的末尾):

$ echo“ factor(12345); quit();” |最大值

Maxima 5.41.0 http://maxima.sourceforge.net 使用Lisp GNU Common Lisp(GCL)GCL 2.6.12 根据GNU公共许可证分发。参见文件COPYING。 献给威廉·切尔特(William Schelter)。 函数bug_report()提供错误报告信息。 (%i1)(%o1)3 5823 $

在Octave系统中-commad在“-标记内使用双”“来获取”:

[状态,输出] = system(“ echo”“ factor(565); quit();”“ | maxima”) 状态= 0 输出= 千里马5.41.0 http://maxima.sourceforge.net 使用Lisp GNU Common Lisp(GCL)GCL 2.6.12 根据GNU公共许可证分发。参见文件COPYING。 献给威廉·切尔特(William Schelter)。 函数bug_report()提供错误报告信息。 (%i1)(%o1)5113

额外的txt可以从Octave的输出-string中删除。使用Maxima的属性从脚本文件运行其命令,该脚本可以在Octave中创建。

Br。 Juha(juhap.karjalainen@mail.suomi.net)