zoukankan      html  css  js  c++  java
  • matlab符号运算

    转载自:http://blog.chinaunix.net/uid-20559667-id-1924747.html

    %% 符号变量与符号表达式
    %%%%%%%%%%%%%%%%%%%%%%%%%%%
    %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函数程序安装
    % 具体的操作参看相关说明
  • 相关阅读:
    BZOJ3752 : Hack
    XIV Open Cup named after E.V. Pankratiev. GP of SPb
    XIII Open Cup named after E.V. Pankratiev. GP of Ukraine
    BZOJ2087 : [Poi2010]Sheep
    BZOJ2080 : [Poi2010]Railway
    BZOJ2082 : [Poi2010]Divine divisor
    Moscow Pre-Finals Workshop 2016. National Taiwan U Selection
    XIII Open Cup named after E.V. Pankratiev. GP of Asia and South Caucasus
    XIII Open Cup named after E.V. Pankratiev. GP of Azov Sea
    XIII Open Cup named after E.V. Pankratiev. GP of SPb
  • 原文地址:https://www.cnblogs.com/batteryhp/p/5020433.html
Copyright © 2011-2022 走看看