声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5667|回复: 1

[混合编程] MATLAB与Maple联合符号运算

[复制链接]
发表于 2005-6-26 08:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
首先声明,如果你想说谢谢的话就免了,欢迎跟帖讨论相关用法。

MATLAB与Maple的符号运算
Chinamaker
http://www.dytrol.com 动力学与控制技术论坛

一 访问Maple函数
Maple命令非常之多,有几千个,使用都非常灵活多变。考虑到本书的特点,就不详细赘述,只介绍两种最常用的调用格式:maple(statement)和maple('function',arg1,arg2,…)。函数maple用于调用Maple中的符号计算“引擎”和它庞大的函数库,其中的输入参数即可以是符号变量,也可以是数值变量,其输出结构和输入参数的类型相同。
1.maple(statement)
该命令的功能是把对变量、表达式以及函数等的描述(statement)传递到MATLAB的符号运算引擎——Maple V中去,由这个引擎来完成计算任务,返回字符型结果。此函数功能非常强,它可以调用出图像处理函数外的所有函数。例如:
dsolve函数是Maple中解微分方程的函数,可以是单个微分方程,也可以是微分方程组。
【实例1】
>> maple(dsolve('(Dy)^2+y^2=1','y(0)=0.5'))
ans =
[ sin(t+1/6*pi)]
[ cos(t+1/3*pi)]
2. maple('function',arg1,arg2,…)
该命令是MATLAB调用Maple函数库的标准形式。输入参数function是函数的名,arg1,arg2,…是function函数的参数,参数个数根据function函数具体确定。
【实例2】
>>maple('mtaylor(exp(x),[x=0],5)')
ans =
mtaylor(exp(x),[x = 0],5)
注意:Maple有些函数在MATLAB启动时,并没有自动调入内存当中。上面的例子中并没有进行分解,所以在调用这些函数时候必须先读取Maple函数库。
【实例3】
>> maple('readlib(mtaylor)')
ans =
proc () local f, k, v, m, n, s, t, w; option `Copyright (c) 1991 by………………
然后我们就重新调用maple('mtaylor(exp(x),[x=0],5)')如下:
>> maple('mtaylor(exp(x),[x=0],5)')
ans =
1+x+1/2*x^2+1/6*x^3+1/24*x^4

二 运行MAPLE程序
在实际的计算中,也许一般情况下,我们运行单个maple命令即可满足要求,在更复杂的情况下,我们就不得不采用Maple编写的程序。前一种情况,上一节我们已经见过了,而后一种情况就必须有procread和maple配合才能完成。
下面采用配合实例的方法对其用法进行讲解。
【实例4】设计求取一般隐含数f(x,y)=0的导数y'解析解的程序,并要求该程序能像Maple原有函数一样被调用。
读者可参照以下步骤进行:
(1)SRC源代码文件的编写;
编写文件DYTROL.src,把它存放在MATLAB的工作目录下(可以放在MATLAB任意可以搜索到的目录下),文件内容为:
DYTROL:=proc(f)
local Eq,deq,imderiv;
Eq:='Eq';
Eq:=f;
deq:=diff(Eq,x);
readlib(isolate);
imderiv:=isolate(deq,diff(y(x),x));
end;
(2)将源代码装入Maple工作空间;
运行以下命令把DYTROL.src安装到Maple工作空间:
procread('DYTROL.src') %转换SRC代码,装入Maple工作空间
运行后得到:
ans =
dytrol := proc (f) local Eq, deq, imderiv; Eq := 'Eq'; Eq := f; deq := diff(Eq,x); readlib(isolate); imderiv := isolate(deq,diff(y(x),x)) end
(3)借助maple命令调用驻留在内存中的新函数文件;
在MATLAB命令窗口输入命令会立即得到结果,如下:
>> s1=maple('DYTROL(x=sin(x+y(x)));')
s2=maple('DYTROL(x^2*y(x)-log(2*x)=sin(y(x)))')
s3=maple('DYTROL','sin(x+log(y(x)))=cos(y(x))')
s1 =
diff(y(x),x) = 1/cos(x+y(x))-1
s2 =
diff(y(x),x) = (-2*x*y(x)+1/x)/(x^2-cos(y(x)))
s3 =
diff(y(x),x) = -cos(x+log(y(x)))*y(x)/(cos(x+log(y(x)))+sin(y(x))*y(x))
(4)将DYTROL.src进行预编辑,就成为Maple的内码文件,保存在bin目录中。
上面的程序有个缺点,每次启动MATLAB后都要执行:
procread('DYTROL.src')
为了避免这种情况,可遵循以下步骤:
1)清理Maple的工作空间;
2)向该空间中装入源代码;
3)将SRC文件转换成Maple的内码M文件,并保存在mallab\bin目录中;
以DYTROL.src为例,指令集如下:
clear maplemex
procread('DYTROL.src');
maple('save('DYTROL.m')');
(5)调用Maple自建的内码文件。
maple('read','DYTROL.m');
ss3=maple('DYTROL','sin(x+log(y(x)))=cos(y(x))')
s3 =
diff(y(x),x) = -cos(x+log(y(x)))*y(x)/(cos(x+log(y(x)))+sin(y(x))*y(x))
说明:当Maple源文件被procread处理之后,或者M文件被Maple读入工作空间之后,就可以随时使用了,而不必每次都再次读入。

12.3 小 结
版权所有:动力学与控制技术论坛 http://www.dytrol.com (转载说明出处)
本节主要提到MATLAB如何调用Maple函数,这也是MATLAB本身功能的一个延伸和增强。MATLAB之所以有如此强大的符号运算功能,完全归功于MathWork公司收购了Maple的内核,为MATLAB发展起到如虎添翼的作用。
回复
分享到:

使用道具 举报

发表于 2023-11-7 15:08 | 显示全部楼层
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-23 01:40 , Processed in 0.059570 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表