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

How to execute multi-line Maxima code from Octave / Matlab

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

我假设您正在使用 QtOctave,我是通过谷歌搜索您的错误消息“_ide_reload_variables_list( whos() );”猜测的 如果不是这样,以下 none 可能适用于您的问题。

在提示符下输入 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({command_1,command_2}) 调用函数 maxima,其中 command_i 是字符串.

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

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

This 您可能也会感兴趣,因为它描述了 Octave 与子进程交互的方法。

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

最后但并非最不重要的一点,据我所知,在八度音阶(或 matlab)和最大值之间没有 真实 接口。如果我错了,我希望有人能纠正我。

感谢 Fred Senese 和 rayryeng 的协助。

我知道有人可能需要这个,所以这里有一些示例代码。这段代码允许您从 Octave 直接访问 maxima 的符号求解器(允许您执行多行 maxima 命令)。由于 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),(s))")
%mm = '[angle_deg = 75.01323334803705]';

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

>>>number =  75.013

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

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

$回声“因子(12345);退出();” |最大值

千里马 5.41.0 http://maxima.sourceforge.net 使用 Lisp GNU Common Lisp (GCL) GCL 2.6.12 在 GNU Public 许可证下分发。请参阅文件复制。 献给 William Schelter 的记忆。 函数 bug_report() 提供错误报告信息。 (%i1) (%o1) 3 5 823 $

在 Octave 系统中-commad 在“-marks 中使用双“”来获得“:

[status,output]=system("echo ""factor(565);quit();""|maxima") status = 0 output = Maxima 5.41.0 http://maxima.sourceforge.net using Lisp GNU Common Lisp (GCL) GCL 2.6.12 Distributed under the GNU Public License. See the file COPYING. Dedicated to the memory of William Schelter. The function bug_report() provides bug reporting information. (%i1) (%o1) 5 113

可以从 Octave 的输出字符串中删除额外的 txt。使用 Maxima 的属性 运行 它是来自脚本文件的命令,并且可以在 Octave 中创建脚本。

Br。朱哈 (juhap.karjalainen@mail.suomi.net)