日日行,不怕千万里;时时学,不怕千万卷
分类:
2007-12-31 11:20:07
Matlab的符号运算功能强大,看了些资料,都比较啰嗦,然后再次总结为一个m文件测试大部分符号运算功能
%% 符号变量与符号表达式 %%%%%%%%%%%%%%%%%%%%%%%%%%% %1.符号变量与符号表达式 %%%%%%%%%%%%%%%%%%%%%%%%%%% clear all ; clc; close all; % f =sym( 'sin(x)+5x') % f —— 符号变量名 % sin(x)+5x—— 符号表达式 % ' '—— 符号标识 % 符号表达式一定要用' ' 单引号括起来matlab才能识别 % ' ' 的内容可以是符号表达式,也可以是符号方程。 % 例: % f1=sym('a*x^2+b*x+c') —— 二次三项式 % f2=sym('a*x^2+b*x+c=0' )—— 方程 % f3=sym('Dy+y^2=1') ——微分方程 % 符号表达式或符号方程可以赋给符号变量,以后调用方便;也可以不赋给符号变量直接参与运算 % syms 命令用来建立多个符号量,一般调用格式为: % syms 变量1 变量2 ... 变量n %% 符号矩阵的创建 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %2.符号矩阵的创建 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 数值矩阵A=[1,2;3,4] % A=[a,b;c,d] —— 不识别 % @1.用matlab函数sym创建矩阵(symbolic的缩写) % 命令格式:A=sym('[ ]') % ※ 符号矩阵内容同数值矩阵 % ※ 需用sym指令定义 % ※ 需用' '标识 % 例如: A = sym('[a , 2*b ; 3*a , 0]') % A = % [ a, 2*b] % [3*a, 0] % 这就完成了一个符号矩阵的创建。 % 注意:符号矩阵的每一行的两端都有方括号,这是与 matlab数值矩阵的一个重要区别。 %@2.用字符串直接创建矩阵(这种方法创建的没有什么用处) % ※模仿matlab数值矩阵的创建方法 % ※需保证同一列中各元素字符串有相同的长度。 % 例: A =['[ a,2*b]'; '[3*a, 0]'] % A = % [ a, 2*b] % [3*a, 0] %@3.符号矩阵的修改 % a.直接修改 % 可用光标键找到所要修改的矩阵,直接修改 % b.指令修改 % ※用A1=sym(A,*,*,'new') 来修改。 这个经过测试,不能运行 % ※用A1=subs(A, 'new', 'old')来修改 % % 例如:A =[ a, 2*b] % [3*a, 0] A = sym('[a , 2*b ; 3*a , 0]') % A1=sym(A,2,2,'4*b') %%等效于A(2,2)='4*b'; % A1 =[ a, 2*b] % [3*a, 4*b] A1=subs(A,'0','4*b') A2=subs(A1, 'c', 'b') % A2 =[ a, 2*c] % [3*a, 4*c] %@4.符号矩阵与数值矩阵的转换 % ※将数值矩阵转化为符号矩阵 % 函数调用格式:sym(A) A=[1/3,2.5;1/0.7,2/5] % A = % 0.3333 2.5000 % 1.4286 0.4000 B=sym(A) % ans = % [ 1/3, 5/2] % [10/7, 2/5] % ※将符号矩阵转化为数值矩阵 % 函数调用格式: numeric(A) % B = % [ 1/3, 5/2] % [10/7, 2/5] %numeric(B) 这个函数不存在了 VPA(B,4) %发现这个函数可用 % R = VPA(S) numerically evaluates each element of the double matrix % S using variable precision floating point arithmetic with D decimal % digit accuracy, where D is the current setting of DIGITS. % The resulting R is a SYM. % % VPA(S,D) uses D digits, instead of the current setting of DIGITS. % D is an integer or the SYM representation of a number. % ans = % [ .3333, 2.500] % [ 1.429, .4000] %% 符号运算 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%3. 符号运算 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 例1: f=sym( '2*x^2+3*x-5'); g=sym( 'x^2+x-7'); h= f+g % h= % 3*x^2+4*x-12 % 例2: f=sym('cos(x)');g=sym('sin(2*x)'); f/g+f*g % ans = % cos(x)/sin(2*x)+cos(x)*sin(2*x) %% 查找符号变量 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%4.查找符号变量 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % findsym(expr) 按字母顺序列出符号表达式 expr 中的所有符号变量 % % findsym(expr, N) 列出 expr 中离 x 最近的 N 个符号变量 % 若表达式中有两个符号变量与 x 的距离相等,则ASCII 码大者优先。 % ※常量 pi, i, j 不作为符号变量 % 例: f=sym('2*w-3*y+z^2+5*a'); findsym(f) % ans = % a, w, y, z findsym(f,3) % ans = % y,w,z findsym(f,1) % ans = % y %% 计算极限 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%5.计算极限 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % limit(f,x,a): 计算f(x)当x趋向于a的极限 % limit(f,a): 当默认变量趋向于 a 时的极限 % limit(f): 计算 a=0 时的极限 % limit(f,x,a,'right'): 计算右极限 % limit(f,x,a,'left'): 计算左极限 % 例:计算 syms x h n; L=limit((log(x+h)-log(x))/h,h,0) % L = % 1/x M=limit((1-x/n)^n,n,inf) % M = % exp(-x) %% 计算导数 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%6.计算导数 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % g=diff(f,v):求符号表达式 f 关于 v 的导数 % g=diff(f):求符号表达式 f 关于默认变量的导数 % g=diff(f,v,n):求 f 关于 v 的 n 阶导数 syms x; f=sin(x)+3*x^2; g=diff(f,x) % g = % cos(x)+6*x %%计算积分 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%7.计算积分 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % int(f,v,a,b): 计算定积分f(v)从a到b % int(f,a,b): 计算关于默认变量的定积分 % int(f,v): 计算不定积分f(v) % int(f): 计算关于默认变量的不定积分 f=(x^2+1)/(x^2-2*x+2)^2; I=int(f,x) % I = % 3/2*atan(x-1)+1/4*(2*x-6)/(x^2-2*x+2) K=int(exp(-x^2),x,0,inf) % K = % 1/2*pi^(1/2) %%函数运算 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%8.函数运算 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 1.合并、化简、展开等函数 % collect函数:将表达式中相同幂次的项合并; % factor函数:将表达式因式分解; % simplify函数:利用代数中的函数规则对表达式进行化简; % numden函数:将表示式从有理数形式转变成分子与分母形式。 % 2.反函数 % finverse(f,v) 对指定自变量为v的函数f(v)求反函数 % 3.复合函数 % compose(f,g) 求f=f(x)和g=g(y)的复合函数f(g(y)) % compose(f,g,z) 求 f=f(x)和g=g(y)的复合函数f(g(z)) % 4.表达式替换函数(前面讲到了) % subs(s) 用赋值语句中给定值替换表达式中所有同名变量 % subs (s, old, new) 用符号或数值变量new替换s中的符号变量old %% % mtaylor(f,n) —— 泰勒级数展开 % ztrans(f) —— Z变换 % Invztrans(f) —— 反Z变换 % Laplace(f) —— 拉氏变换 % Invlaplace(f) —— 反拉氏变换 % fourier(f) —— 付氏变换 % Invfourier(f) —— 反付氏变换 %% clear f1 =sym('(exp(x)+x)*(x+2)'); f2 = sym('a^3-1'); f3 = sym('1/a^4+2/a^3+3/a^2+4/a+5'); f4 = sym('sin(x)^2+cos(x)^2'); collect(f1) % ans = % x^2+(exp(x)+2)*x+2*exp(x) expand(f1) % ans = % exp(x)*x+2*exp(x)+x^2+2*x factor(f2) % ans = % (a-1)*(a^2+a+1) [m,n]=numden(f3) %m为分子,n为分母 % m = % 1+2*a+3*a^2+4*a^3+5*a^4 % n = % a^4 simplify(f4) % ans = % 1 clear syms x y finverse(1/tan(x)) %求反函数,自变量为x % ans = % atan(1/x) f = x^2+y; finverse(f,y) %求反函数,自变量为y % ans = % -x^2+y clear syms x y z t u; f = 1/(1 + x^2); g = sin(y); h = x^t; p = exp(-y/u); compose(f,g) %求f = f(x) 和 g = g(y)的复合函数f(g(y)) % ans = % 1/(1+sin(y)^2) clear syms a b subs(a+b,a,4) %用4替代a+b中的a % ans = % 4+b subs(cos(a)+sin(b),{a,b},{sym('alpha'),2}) %多重替换 % ans = % cos(alpha)+sin(2) f=sym('x^2+3*x+2') % f = % x^2+3*x+2 subs(f, 'x', 2) %求解f当x=2时的值 % ans = % 12 %% 方程求解 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%9.方程求解 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 1代数方程 % 代数方程的求解由函数solve实现: % solve(f) 求解符号方程式f % solve(f1,…,fn) 求解由f1,…,fn组成的代数方程组 % % 2常微分方程 % 使用函数dsolve来求解常微分方程: % dsolve('eq1, eq2, ...', 'cond1, cond2, ...', 'v') clear syms a b c x f=sym('a*x*x+b*x+c=0') solve(f) % ans = % [ 1/2/a*(-b+(b^2-4*c*a)^(1/2))] % [ 1/2/a*(-b-(b^2-4*c*a)^(1/2))] solve('1+x=sin(x)') % ans = % -1.9345632107520242675632614537689 dsolve( ' Dy=x ','x') %求微分方程y'=x的通解,指定x为自变量。 % ans = % 1/2*x^2+C1 dsolve(' D2y=1+Dy ','y(0)=1','Dy(0)=0' ) %求微分方程y''=1+y'的解,加初始条件 % ans = % -t+exp(t) [x,y]=dsolve('Dx=y+x,Dy=2*x') %微分方程组的通解 % x = % -1/2*C1*exp(-t)+C2*exp(2*t) % y = % C1*exp(-t)+C2*exp(2*t) % ezplot(y)方程解y(t)的时间曲线图 %% funtool funtool %该命令将生成三个图形窗口,Figure No.1用于显示函数f的图形, % Figure No.2用于显示函数g的图形, % Figure No.3为一可视化的、可操作与显示一元函数的计算器界面。 % 在该界面上由许多按钮,可以显示两个由用户输入的函数的计算结果: % 加、乘、微分等。funtool还有一函数存储器,允许用户将函数存入, % 以便后面调用。在开始时, % funtool显示两个函数f(x) = x与g(x) = 1在区间[-2*pi, 2*pi]上的图形。 % Funtool同时在下面显示一控制面板, % 允许用户对函数f、g进行保存、更正、重新输入、联合与转换等操作。 %% taylortool %该命令生成一图形用户界面,显示缺省函数f=x*cos(x) % 在区间[-2*pi,2*pi]内的图形,同时显示函数f % 的前N=7项的Taylor多项式级数和(在a=0附近的)图形, % 通过更改f(x)项可得不同的函数图形。 % taylortool('f') %对指定的函数f,用图形用户界面显示出Taylor展开式 %% maple内核访问函数 % % 可以访问maple内核的matlab函数: % maple ——— 访问maple内核函数 % mapleinit —— maple函数初始化 % mpa ———— maple函数定义 % mhelp ——— maple函数帮助命令 % procread —— maple函数程序安装 % 具体的操作参看相关说明 |
chinaunix网友2010-05-06 15:24:30
有幸到您空间来学习,小弟有问题想请教啊 如题:f=tan(x)+(P*l/Q/x),求f的零点。要求结果用符号P。Q。l表示。
wangfanlion2009-06-24 09:16:17
可疑点不就是让f求导等于0, 然后再判断可疑点附近导数的正负, 所以总体过程就是求导等于0, 然后再判断 至于你的变量比较多,能否能确定导数的正负是个问题 所以不一定能判定是极值点