数学建模更新14(MATLAB运算)
发布日期:2021-05-07 23:24:46 浏览次数:14 分类:精选文章

本文共 6166 字,大约阅读时间需要 20 分钟。

MATLAB运算

一.符号变量的创建和简单运算

function F = my_fun(x)    F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);    F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;end

1. 简单符号变量的创建

syms x  % 观察工作区, sym是symbolic的缩写syms a b c

2.符号方程的创建,两种方法

syms a xy = a*x+x^2% y = str2sym('a*x+x^2')  %Matlab 2017b 版本后推出% 符号矩阵syms alphaM = [cos(alpha)  -sin(alpha);       sin(alpha)  cos(alpha)]

二.简单运算

syms a b c d ey = a + b% a + bx = c - d% c - dy1 = x*y% (a + b)*(c - d)y2 = y1/y% c - dy3 = y1^3% (a + b)^3*(c - d)^3y4 = sqrt(y3)   % ((a + b)^3*(c - d)^3)^(1/2)y5 = exp(y4)% exp(((a + b)^3*(c - d)^3)^(1/2))

三.符号表达式的整理

1.化简

% 化简syms ay=(cot(a/2)-tan(a/2))*(1+tan(a)*tan(a/2))simplify(y)% 2/sin(a)

2.因式分解

%% 因式分解factor(12) % 对常数进行因式分解 %      2     2     3syms m n xy = -24*m^2*x-16*n^2*xfactor(y)% [ -8, x, 3*m^2 + 2*n^2]y1=m^3-n^3factor(y1)% [ m - n, m^2 + m*n + n^2]

3.多项式展开

%% 多项式展开syms a xy = a*(x^2-a)^2+(x-2)expand(y)% a^3 - 2*a^2*x^2 + a*x^4 + x - 2

4.合并

%% 合并syms x yz = (x+y)^2*y+5*y*x-2*x^3% expand(z)   - 2*x^3 + x^2*y + 2*x*y^2 + 5*x*y + y^3collect(z,x)% y*x^2 - 2*x^3 + (2*y^2 + 5*y)*x + y^3collect(z,y)% y^3 + 2*x*y^2 + (x^2 + 5*x)*y - 2*x^3

5.计算分子与分母

% [z1,z2] = numden(2.5)  % 会报错,因为numden的输入变量不能是数值,只能是符号变量% ans = sym(2.5);  % sym函数可以将数值2.5转换为符号[z1,z2] = numden(sym(2.5)) % 对常数计算分子与分母% z1 = 5% z2 = 2syms x yz = 1/x*y+x/(x^2-2*y)[z1,z2] = numden(z)  %z1分子,z2分母% z1 = - x^2*y - x^2 + 2*y^2% z2 = x*(- x^2 + 2*y)

7.让结果显示的更加自然

syms x yM = (1/x*y+x/(x^2-2*y)-x^2/(3+y)^2)^2;expand(M)  % y^2/x^2 + x^4/(y^4 + 12*y^3 + 54*y^2 + 108*y + 81) + (2*x^3)/(- x^2*y^2 - 6*x^2*y - 9*x^2 + 2*y^3 + 12*y^2 + 18*y) - (2*y)/(- x^2 + 2*y) + x^2/(x^4 - 4*x^2*y + 4*y^2) - (2*x*y)/(y^2 + 6*y + 9)mupad % 未来的版本可能会移除这个工具箱,可以点击Matlab的主页,新建实时脚本

四.符号函数的求导

1.一元函数的导数

% 一元函数的导数syms xy = x^4-5*x^2+6diff(y) %求一阶导数% 4*x^3 - 10*xdiff(y,2) %求二阶导数% 12*x^2 - 10y = cos(x)*tan(x)dy = diff(y,10)  %求十阶导数simplify(dy)y = sin(x)*tan(x)dy = diff(y,10)  %求十阶导数simplify(dy)

2.多元函数的导数

% 多元函数的导数syms x1 x2 x3y1 = x1^5*x2+x2*x3-x1^2*x3py1 = diff(y1,x1,1) % 对x1求一阶偏导% 5*x2*x1^4 - 2*x3*x1py2 = diff(y1,x1,2) % 对x1求二阶偏导% 20*x2*x1^3 - 2*x3py3 = diff(y1,x1,x2) % 先对x1求偏导,再对x2求偏导% 5*x1^4py4 = diff(y1,x2,x1) % 先对x2求偏导,再对x1求偏导% 5*x1^4

3.求差分

%% 注意,如果diff函数作用的对象不是符号函数,而是矩阵,那么对应的功能是求差分。A=[4 5 6 3 2 1];diff(A)  % 求向量A的一阶差分     1     1    -3    -1    -1diff(A,2)  % 在一阶差分的基础上再差分一次     0    -4     2     0A=[4 5 6;      7 4 2;     5 6 2]A1=diff(A)  % 下一行减去上一行求一阶差分%      3    -1    -4%     -2     2     0A2=diff(A,2) % 下一行减去上一行求二阶差分(在一阶差分的基础上再差分一次)%     -5     3     4A3=diff(A,2,1) % 最后面的1表示在行上进行差分(在列的方向上进行差分)%     -5     3     4A4=diff(A,1,2)  % 后一列减去前一列求一阶差分, 最后面的2表示在列上进行差分(在行的方向上进行差分)%      1     1%     -3    -2%      1    -4A4=diff(A,2,2) % 后一列减去前一列求二阶差分%      0%      1%     -5

五.积分

1.不定积分

syms xy = x^2int(y,x)% x^3/3 注意,Matlab计算时不会给我们加上常数C
syms xy = 1/xint(y,x)% log(x)  注意,Matlab计算1/x形式的不定积分时不会给我们加上绝对值~
syms xy = x^2 / (1+x^2)int(y,x)% x - atan(x)
syms xy = 1/(exp(x)+1)int(y,x)% x - log(exp(x) + 1)
syms x ay = 1/sqrt(x^2-a^2)int(y,x)% log(x + (x^2 - a^2)^(1/2))

2.定积分

%% 定积分syms xy = sin(x)int(y,x,0,pi/2) % 1
syms x a by = exp(x)int(y,x,a,b)% exp(b) - exp(a)
syms xy = (sin(x))^2 / x^2b=int(y,x,0,+inf)% pi/2
% 注意,不是所有的函数都可以利用int函数计算出最后的结果,例如:syms xy = 1 / exp(x) * log(x+2*x^2+sin(x))int(y,x,0,4)% int(exp(-x)*log(x + sin(x) + 2*x^2), x, 0, 4)
% 我们可以计算数值积分:数值积分可用于求定积分的近似值。在数值分析中,数值积分是计算定积分数值的方法和理论。% 在数学分析中,给定函数的定积分的计算不总是可行的,许多定积分不能用已知的积分公式得到精确值。y = @(x) 1 ./ exp(x) .* log(x+2.*x.^2+sin(x))  % 注意,写成函数句柄时,要用点乘或者点除integral(y,0,4)xx = 0:0.1:4;yy = 1 ./ exp(xx) .* log(xx+2*xx.^2+sin(xx));plot(xx,yy,'-')

六.matlab求解方程和方程组

1.solve函数

【1】例题1: 求解单变量方程

%% solve函数%% 例题1: 求解单变量方程clear;clcsyms xansw = solve(sin(x) == 1, x)  % 注意:这里的等号一定要有两个,一个等号表示赋值,两个等号才表示左右两边相等answ = solve(sin(x) == 1)  % 只有一个符号变量x,所以可以不指定未知数% 也可以这样写clear;clcsyms xeqn = (sin(x) == 1);  % eqn = sin(x) == 1;  answ = solve(eqn, x)% 因为三角函数是周期函数,如果要得到所有的解,则需要加上条件[answ, params, condions] = solve(eqn, x, 'ReturnConditions', true)

【2】例题2: 多变量方程求解

%% 例题2: 多变量方程求解clear;clcsyms a b c xeqn = (a*x^2 + b*x + c == 0);answ1 = solve(eqn, x)  % 将x视为未知数求解 %  -(b + (b^2 - 4*a*c)^(1/2))/(2*a)%  -(b - (b^2 - 4*a*c)^(1/2))/(2*a)answ2 = solve(eqn, a) % 将a视为未知数求解% -(c + b*x)/x^2

【3】例题3:方程组求解

%% 例题3:方程组求解clear;clcsyms u v aeqn = [2*u + v == a, u - v == 1];answ = solve(eqn, [u, v])answ.uansw.v[answ_u, answ_v] = solve(eqn, [u, v])

2.其他类型

%% solve 可能会警告syms xeqn = (sin(x) == x^2 - 1);solve(eqn, x)  % 警告: Cannot solve symbolically. Returning a numeric approximation instead. % 画图看看 fplot(sin(x), [-2 2])  % fplot函数可绘制表达式的图形hold onfplot(x^2 - 1, [-2 2])

3.vpasolve函数求解

%% vpasolve函数求解% 用vpasolve函数指定求[0 2]上的解syms xeqn = sin(x) == x^2 - 1;vpasolve(eqn, x, [0 2])vpasolve(eqn, x, [-1 0])vpasolve(eqn, x, [-10 10])% vpasolve returns all solutions only for polynomial equations. % For nonpolynomial equations, there is no general method of finding all solutions.% When you look for numerical solutions of a nonpolynomial equation or system that has several solutions,% then, by default, vpasolve returns only one solution, if any. % To find more than just one solution, set random to true. % Now, calling vpasolve repeatedly might return several different solutions.vpasolve(eqn, x, 'random', true) vpasolve(eqn, x, -5)   % 给定搜索的起始点

4.ezplot函数

%% 来看一个更复杂的例子syms x yeqn = [x^2 - 2*x - 3*x*y == 10, y^4 == exp(-2*x/3*y)][answ_x, answ_y] = vpasolve(eqn, [x, y], 'random', true)% 画图看看ezplot(x^2 - 2*x - 3*x*y == 10, [-10 10])hold onezplot(y^4 == exp(-2*x/3*y), [-10 10])close % 关闭图形

5.fimplicit函数

% ezplot函数比较鸡肋,下面这个函数比较厉害哦fimplicit(x^2 - 2*x - 3*x*y == 10, [-10 10],'r')  % R2016b版本之后才有hold onfimplicit(y^4 == exp(-2*x/3*y), [-10 10],'b')  % R2016b版本之后才有[answ_x, answ_y] = vpasolve(eqn, [x, y],[-4 -1;1 5])  % 指定搜索的范围:x位于[-4 -1], y位于[1 5]hold onplot(answ_x, answ_y,'ko', 'MarkerSize',10)   % plot(double(answ_x), double(answ_y),'ko', 'MarkerSize',10)   % double可以将我们的符号变量转换为数值变量

6.fsolve函数

%% fsolve函数(求解功能最为强大哦)% fsolve是Matlab优化工具箱中的一个函数,可专门用来求解特别复杂的方程和方程组x0 = [0,0];  % 初始值result_x = fsolve(@my_fun,x0)% 当然你也可以用vpasolve函数试试clear; clcsyms x1 x2eqn =  [exp(-exp(-(x1+x2))) - x2*(1+x1^2) == 0, x1*cos(x2) + x2*sin(x1) - 0.5 == 0][answ_x1, answ_x2] = vpasolve(eqn, [x1, x2], [0 0])
上一篇:数学建模更新12(数学线性规划模型1)
下一篇:数学建模更新13(MATLAB绘制三维图【下】)

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年03月30日 14时23分16秒