找回密码
 注册
Simdroid-非首页
查看: 312|回复: 13

[讨论]MATLAB里如何调用maple中的命令?

[复制链接]
发表于 2005-8-9 23:04:19 | 显示全部楼层 |阅读模式 来自 上海黄浦区
比如struve这个函数好象比较生僻,问老先生也说不知道,但查到MAPLE里有。

[ 本帖最后由 bainhome 于 2006-10-4 13:29 编辑 ]

评分

1

查看全部评分

发表于 2005-8-10 01:29:15 | 显示全部楼层 来自 新疆乌鲁木齐

Re:MATLAB里有没有STRUVE函数?

Simdroid开发平台
这个命令在maple中的具体格式是StruveL和StruveH,可以用mhelp看到,但是这个问题以前我就发过贴,是替别人解决问题时捎带发现的:就是用mhelp所发现的一些命令,无法通过(严格意义上应该是我没有发现)使用maple('statement')的方式进行调用.至今为止我所发现的可以使用这个方式得到结果的maple的命令有mtaylor(多元函数的taylor展开)和帮助中自带的一个π取100位小数的maple命令,当然用vpa就可以轻松解决,但现在的目的是了解maple中的命令是如何在MATLAB中被调用的,这里是指一些具体细节,例如楼主这个命令在mhelp中是这样给出解释的:
>> mhelp struve

StruveH, StruveL - Struve functions

Calling Sequence
     StruveH(v, x)

     StruveL(v, x)

Parameters
     v - algebraic expression (order or index)

     x - algebraic expression (argument)

Description
- The Struve function StruveH(v, x) solves the inhomogeneous Bessel equation

                                                v + 1
                                       4 (1/2 x)
    x^2*y'' + x*y' + (x^2-v^2)*y =  --------------------
                                      1/2
                                    Pi    GAMMA(v + 1/2)

- The modified Struve function StruveL(v, x) solves the inhomogeneous Bessel
...

- Reference: M. Abramowitz and I. Stegun, Handbook of Mathematical Functions,
  chapter 12.

Examples
> StruveH(0,0);

                                       0

> StruveL(1.5-I,2.6+3*I);

                         -6.136109206 - 0.3149238903 I
中间省略部分,可以自己去看mhelp,simwe的编辑格式好像不支持,都是自动左对齐的.
...

See Also
Airy, Anger, inifcns, Bessel, convert[Bessel], Kelvin

而以上struveL我试了几次无法在MATLAB中得到结果,mtaylor却可以:如下是今晚自己试的一个求解mhelp帮助中mtaylor的一个例子,可以得到与MAPLE相同的结果:
同样,mhelp中的其他具体内容自己去看吧我只是给出相关信息,这道例子的maple格式就在其中:
>> mhelp mtaylor
...

> mtaylor(sin(x^2+y^2), [x=1,y],3)
     sin(1) + 2 cos(1) (x - 1) + (-2 sin(1) + cos(1)) (x - 1)^2  + cos(1) y^2
See Also
taylor, series, coeftayl  

以下是MATLAB中调用maple命令的运行结果,与上面的一模一样:
syms x y
f=sin(x^2+y^2);
maple('mtaylor',f,'[x=1,y]',3)
==========================================================================
ans =
sin(1)+2*cos(1)*(x-1)+(-2*sin(1)+cos(1))*(x-1)^2+cos(1)*y^2
始终相信可以在MATLAB中调用大多数maple的命令,问题是how?
最后给出实际maple所作出的结果:
(忘记补充一点,如果你用的是"MATLAB for student version",你看不到mhelp的内容.)
^_^

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

发表于 2005-8-10 08:41:18 | 显示全部楼层 来自 浙江杭州

Re:[讨论]MATLAB里如何调用maple中的命令?

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读入工作空间之后,就可以
随时使用了,而不必每次都再次读入。

评分

1

查看全部评分

发表于 2005-8-10 13:45:37 | 显示全部楼层 来自 浙江杭州

Re:[讨论]MATLAB里如何调用maple中的命令?

大部分maple的功能都没用过,不过有些确实很好用
以前用它解过线性不等式,很方便
maple('solve( {x+y < 0, x-y>1},{x,y} )')

ans =

{1-x+y < 0, x+y < 0, y < -1/2}

maple('solve( {x+y +z< 0, x-y-z>1,x-y+2*z<3},{x,y,z} )')

ans =

{x+y+z < 0, 1-x+y+z < 0, x-y+2*z-3 < 0, z < 2/3}

其实有兴趣的不妨就其他方面的应用探讨一下?

[ 本帖最后由 bainhome 于 2006-10-4 13:31 编辑 ]
发表于 2005-8-10 15:31:11 | 显示全部楼层 来自 新疆乌鲁木齐

Re:[讨论]MATLAB里如何调用maple中的命令?

那先不忙解除置顶了,这个问题我也很想参与一下:
那就还是回到楼主的这个问题上吧.有两个疑问:
1.上面的chinamaker的解释中有关readlib的初始化,我采用如下顺序:
&gt;&gt; maple('readlib(StruveL)')
ans =
proc (v::algebraic, x::algebraic) local s; option `Copyright (c) 1995 by Waterloo Maple Inc. All rights reserved.`; if nargs &lt;&gt; 2 then error "expecting 2 arguments, got %1", nargs elif type(v,'complex(float)') or type(x,'complex(float)') then s := evalf(('StruveL')(v,x)); if type(s,'complex(float)') then return s end if end if; if hastype([v, x],'Inf') then return ('StruveL')(v,x) elif type([x, v],{['NaN', 'complex(extended_numeric)'], ['complex(extended_numeric)', 'NaN']}) then NumericTools:-ThrowUndefined(v*x) elif type(v,'integer') then if type(x,'complex(numeric)') and csgn(x) = -1 or type(x,'`*`') and type(op(1,x),'complex(numeric)') and csgn(op(1,x)) &lt; 0 then return -(-1)^v*StruveL(v,-x) elif type(x,'`+`') then try if sign(x) = -1 then return -(-1)^v*StruveL(v,-x) end if catch "unable to evaluate sign": NULL end try elif x = i or type(x,'`*`') and member(i,{op(x)}) then return i^(v+1)*StruveH(v,-i*x) end if end if; if x = 0 and type(v,'complex(numeric)') then if v = -1 then 2/pi elif -1 &lt; Re(v) then 0 else if hastype([x, v],'nonreal') then NumericEvent('division_by_zero',Inf+Inf*i) else NumericEvent('real_to_complex',NumericEvent('division_by_zero',Inf+Inf*i)) end if end if elif type(v,'numeric') and v &lt; 0 and frac(-v) = 1/2 then besseli(-v,x) else 'StruveL(v,x)' end if end proc
然后求解StruveL帮助的一道例题仍然不能求解:
&gt;&gt; r = maple('StruveL',1.5-i,2.6+3i)
r =
StruveL(3/2-i,13/5+3*i)
运行结果只是回到了原来的式子.
以下是用maple求解的,两相比较不知道问题出在何处?
2.mtaylor似乎并不需要做readlib的初始化,直接就可以运算,另外evalf也可以直接用,但其他一些命令就没这么好使了,不知道是何原因?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 2005-8-11 00:06:25 | 显示全部楼层 来自 上海黄浦区

Re:[讨论]MATLAB里如何调用maple中的命令?

那 STRUVE函数的具体表达式又是什么了?  能否从MAPLE中直接看到.
发表于 2005-8-11 02:16:28 | 显示全部楼层 来自 新疆乌鲁木齐

Re:[讨论]MATLAB里如何调用maple中的命令?

netbutton wrote:
那 STRUVE函数的具体表达式又是什么了?  能否从MAPLE中直接看到.
第一:我想mhelp中对struve命令的描述已经足够了,struveh和struvel(修正的struve函数)是用于求解非齐次bessel方程的,其表达式在mhelp中就有,是相关于Γ函数的.
第二:感觉楼主的学习次序比较独特,一般来说我们是先学习基本数学或者相关的专业知识,然后用MATLAB验证也好计算也好都属于先体而后用的,楼主给我感觉刚好相反:先查到一个命令叫做struve,并不知道其具体的数学背景就先拿来以某个数学软件做试验,实在令我颇为不解...
因为我一直以为楼主是要用这个函数来解决某种你专业方向上的问题的,而我们则尽力提供它在MATLAB中的具体实现,可是现在看来好像不是那么回事了...变成纯软件意义上的东西了,我本人是坚决反对"脱离命令本身的数学意义纯粹学习命令"这种做法的,故以下我们讨论的问题主题将会偏离楼主的初衷,而转向:"如何利用MATLAB调用其maple的计算引擎进行更加灵活的符号求解",把这个问题讨论的重心放在两个软件的互相调用上.希望楼主能够理解.
发表于 2005-8-11 13:19:05 | 显示全部楼层 来自 浙江杭州

Re:[讨论]MATLAB里如何调用maple中的命令?

bainhome wrote:
那先不忙解除置顶了,这个问题我也很想参与一下:
那就还是回到楼主的这个问题上吧.有两个疑问:
1.上面的chinamaker的解释中有关readlib的初始化,我采用如下顺序:
&gt;&gt; maple('readlib(StruveL)')
ans =
proc (v::algebraic, x::algebraic) local s; option `Copyright (c) 1995 by Waterloo Maple Inc. All rights reserved.`; if nargs &lt;&gt; 2 then error "expecting 2 arguments, got %1", nargs elif type(v,'complex(float)') or type(x,'complex(float)') then s := evalf(('StruveL')(v,x)); if type(s,'complex(float)') then return s end if end if; if hastype([v, x],'Inf') then return ('StruveL')(v,x) elif type([x, v],{['NaN', 'complex(extended_numeric)'], ['complex(extended_numeric)', 'NaN']}) then NumericTools:-ThrowUndefined(v*x) elif type(v,'integer') then if type(x,'complex(numeric)') and csgn(x) = -1 or type(x,'`*`') and type(op(1,x),'complex(numeric)') and csgn(op(1,x)) &lt; 0 then return -(-1)^v*StruveL(v,-x) elif type(x,'`+`') then try if sign(x) = -1 then return -(-1)^v*StruveL(v,-x) end if catch "unable to evaluate sign": NULL end try elif x = i or type(x,'`*`') and member(i,{op(x)}) then return i^(v+1)*StruveH(v,-i*x) end if end if; if x = 0 and type(v,'complex(numeric)') then if v = -1 then 2/pi elif -1 &lt; Re(v) then 0 else if hastype([x, v],'nonreal') then NumericEvent('division_by_zero',Inf+Inf*i) else NumericEvent('real_to_complex',NumericEvent('division_by_zero',Inf+Inf*i)) end if end if elif type(v,'numeric') and v &lt; 0 and frac(-v) = 1/2 then besseli(-v,x) else 'StruveL(v,x)' end if end proc
然后求解StruveL帮助的一道例题仍然不能求解:
&gt;&gt; r = maple('StruveL',1.5-i,2.6+3i)
r =
StruveL(3/2-i,13/5+3*i)
运行结果只是回到了原来的式子.
以下是用maple求解的,两相比较不知道问题出在何处?
2.mtaylor似乎并不需要做readlib的初始化,直接就可以运算,另外evalf也可以直接用,但其他一些命令就没这么好使了,不知道是何原因?
大概matlab中的maple版本低?不知了...没怎么用过~~~
发表于 2005-8-12 13:09:00 | 显示全部楼层 来自 新疆乌鲁木齐

Re:[讨论]MATLAB里如何调用maple中的命令?

bzzz wrote:
大概matlab中的maple版本低?不知了...没怎么用过~~~
好像不是版本的问题,今天早上试了几个基本命令比如sum,int...都是maple和matlab共同具有的命令而且maple早期版本也都应该具有这些命令,可以在maple中直接使用,但通过maple(...)却似乎无法调用,如何才能在matlab中把内置的maple计算引擎叫醒,这个问题我也正在困惑和琢磨中...
谁能给出全面的答案呢?真诚期待中...^_^
 楼主| 发表于 2005-8-12 15:19:28 | 显示全部楼层 来自 上海

Re:[讨论]MATLAB里如何调用maple中的命令?

版主兄谬也。
MATLAB作为一门工具,我就是想通过MATLAB进行编程,利用其丰富的函数库。我的程序运行时间比较长,所以要求程序的效率高,程序需要用到STRUVE、BESSEL、ROMBERG等多个函数。现在除了STRUVE函数外,其它函数都可以直接调用,试想如果我在实现STRUVE函数的时候,总是通过调用MAPLE来实现,那岂不是效率低,速度慢,再怎么说两个软件间调用总是比单用一个软件慢些的,对吧?所以,想知道STRUVE函数的形式,自己编个函数以供调用,也是不得以而为之。
另外,还有个问题是,如果用两个软件,将来打包的时候,不知道会不会有问题?我是要作成EXE文件,供别的界面调用的。
如果我不对的地方,请指正。
发表于 2005-8-12 15:41:52 | 显示全部楼层 来自 新疆乌鲁木齐

Re:[讨论]MATLAB里如何调用maple中的命令?

netbutton wrote:
...
另外,还有个问题是,如果用两个软件,将来打包的时候,不知道会不会有问题?我是要作成EXE文件,供别的界面调用的。
...
以下引自一本混合编程的资料:
使用数据类型:
MATLAB中6个基本数据类型为:double,char,logical,uint8,cell,struct.可以在C语言中编写mex文件、mat文件和引擎应用程序.C语言支持MATLAB支持的所有数据类型(以上所述的)
FORTRAN只支持双精度n×m数组和字符串的创建.经过编译后可以将C和fortran的mex文件像M文件一样处理...

sym格式没有包括在内.看过一些论坛taohe,scie,genial...的讨论,好像符号算法在exe的打包中是不直接支持的...需要的代码可能要你自己编写.
发表于 2005-8-12 18:04:56 | 显示全部楼层 来自 浙江杭州

Re:[讨论]MATLAB里如何调用maple中的命令?

netbutton wrote:
版主兄谬也。
MATLAB作为一门工具,我就是想通过MATLAB进行编程,利用其丰富的函数库。我的程序运行时间比较长,所以要求程序的效率高,程序需要用到STRUVE、BESSEL、ROMBERG等多个函数。现在除了STRUVE函数外,其它函数都可以直接调用,试想如果我在实现STRUVE函数的时候,总是通过调用MAPLE来实现,那岂不是效率低,速度慢,再怎么说两个软件间调用总是比单用一个软件慢些的,对吧?所以,想知道STRUVE函数的形式,自己编个函数以供调用,也是不得以而为之。
另外,还有个问题是,如果用两个软件,将来打包的时候,不知道会不会有问题?我是要作成EXE文件,供别的界面调用的。
如果我不对的地方,请指正。
maple有关的本来就不能打包
至于struve的话, 既然想用了,总是应该知道函数的功能形式喽
自己写一下或者网络上google一下应该很多的
另外
基本上maple的符号运算函数
matlab都提供了相应的数值函数
发表于 2005-8-26 19:03:33 | 显示全部楼层 来自 新疆乌鲁木齐

Re:[讨论]MATLAB里如何调用maple中的命令?

就以本例说明maple的调用,对于struve命令,具体的命令实现形式可以查看mhelp,当找到命令的格式之后,必须是将所有的命令完全以一个字符串的形式传递给maple的计算引擎,前面我一直自作聪明,命令格式是错误的,就老提示我expression错误
举例如下:
上面我已经给出了struve命令的mhelp格式,比如
> StruveL(1.5-I,2.6+3*I);

-6.136109206 - 0.3149238903 I
用matlab调用的方法如下:
>> maple('StruveL','1.5-i','2.6+3*i')
ans =
-6.1361092061378007880789495687437-.31492389031364131405600442145531*i
>> maple('StruveL(1.5-i,2.6+3*i)')
ans =
-6.1361092061378007880789495687437-.31492389031364131405600442145531*i
而前面我用maple('StruveL(1.5-I,2.6+3*I)')出错的原因是对MATLAB来讲I不是一个复数符号,它是区分大小写的.
再比如:
>> maple('series(StruveH(1/3,x),x,4)')
ans =
3/5*2^(2/3)/pi^(1/2)/gamma(5/6)*x^(4/3)-3/55*2^(2/3)/pi^(1/2)/gamma(5/6)*x^(10/3)+O(x^4)
然后用latex一转,可读性就有了
再来一个sum命令的,在maple中,它的功能兼有MATLAB中的sum和symsum的特点,比如无穷级数的表达:
>> x=maple('sum','(-.5)^k','k=1..infinity')
x =
-.33333333333333333333333333333333
再有就是一个MATLAB没有的"递推方程"的求解:
>> maple('rsolve','f(n)=-3*f(n-1)-2*f(n-2)','f(k)')
ans =
(2*f(0)+f(1))*(-1)^k+(-f(0)-f(1))*(-2)^k
也可以用:
maple('rsolve(f(n)=-3*f(n-1)-2*f(n-2),f(k))')
结果相同.
感觉maple这个命令在MATLAB 中有点象maple软件的eval命令,是个执行字符串的命令格式.
同样,这些命令中也有一部分可以通过赋值方式给出,命令是mfun,而能够赋值的函数命令可以通过doc mfunlist得到,因为我现在不用,所以随便看了一下,第一、二类Chebyshev 多项式,Legendre多项式这些在数值分析中出现的东东都有.举个例子:
>> x=0:.1:5;
>> y=mfun('FresnelC',x);
>> plot(x,y)
而且格式是double的,函数的任何突变可以自动转为NaN(没有出错信息,只是图像不连续)

[ 本帖最后由 bainhome 于 2006-10-4 13:33 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

发表于 2005-8-27 11:35:17 | 显示全部楼层 来自 浙江杭州

Re:[讨论]MATLAB里如何调用maple中的命令?

恩,很赞!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-29 01:24 , Processed in 0.070965 second(s), 20 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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