我可以像这样从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);")
^
答案 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)