用matlab求解符号方程及符号方程组

2024-05-04 09:18

本文主要是介绍用matlab求解符号方程及符号方程组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

符号方程的求解

 MATLAB7.0中的符号计算可以求解线性方程(组)、代数方程的符号解、非线性符号方程(组)、常微分方程(组),求解这些方程(组)是通过调用solve函数实现的,如求解代数方程的符号解调用solve函数的格式是solve('eq')、solve('eq','v')、[x1,x2,…xn]=solve('eq1','eq2',…'eqn')等,求解非线性符号方程是调用优化工具箱的fsolve函数,调用格式有fsolve(f,x0)、fsolve(f,x0,options)、[x,fv]=fsolve(f,x0,options,p1,p2…)等,而解常微分方程(组)则是调用dsolve函数,调用的格式有[x1,x2,…]=dsolve('eq1,eq2,…','cond1,cond2…','v')。现将各函数的调用格式列于下表(表5—1),在各个实例中说明各种格式的用法。

表5—1  符号方程求解的solve函数调用格式

调用格式

说明

solve('eq')

对系统默认的符号变量求方程eq=0的根。

solve('eq','v')

对指定变量v求解方程eq(v)=0的根。

[x1,x2,…xn]=solve('eq1','eq2',…'eqn')

对系统默认的一组符号变量求方程组eqi=0(i=1,2,…n)的根。

[v1,v2,…vn]=solve('eq1','eq2',…'eqn','v1','v2',…'vn')

对指定的一组符号变量v1,v2,…vn求方程组eqi=0(i=1,2,…n)的根。

linsolve(A,B)

求符号线性方程(组)AX=B的解。相当于X=sym(A)\sym(B)

fsolve(f,x0)

从x0开始搜索f=0的解。

fsolve(f,x0,options)

根据指定的优化参数options从x0开始搜索f=0的解。

fsolve(f,x0,options,p1,p2…)

优化参数option不是默认时,在p1,p2…条件下求f=0解。优化参数option可取的值有0(默认)和1

[x,fv]=fsolve(f,x0,options,p1,p2…)

优化参数option为默认时,在p1,p2…条件下求f=0解,并输出根和目标函数值。

[x,fv,ex]=fsolve(f,x0,options,p1,p2…)

优化参数option为默认时,在p1,p2…条件下求f=0解,并输出根和目标函数值,并通过exitflag返回函数的退出状态。

[x,fv,ex,out]=fsolve(f,x0,options,p1,p2…)

优化参数option为默认时,在p1,p2…条件下求f=0解,并给出优化信息。

[x,fv,ex,out,jac]=fsolve(f,x0,options,p1,p2…)

优化参数option为默认时,在p1,p2…条件下求f=0解,输出值为x处的jacobian函数。

[x1,x2,…]=dsolve('eq1,eq2,…','cond1,cond2…','v')

在初始条件为cond1,cond2…时求微分方程组eq1,eq2,…对指定变量v的特解。

[x1,x2,…]=dsolve('eq1','eq2',…,'cond1','cond2'…,'v')

同[x1,x2,…]=dsolve('eq1,eq2,…','cond1,cond2…','v')

一、代数方程的符号解

MATLAB7.0中求代数方程的符号解是通过调用solve函数实现的。用solve函数求解一个代数方程时的调用格式一般是:

solve('代数方程','未知变量')或x=solve('代数方程','未知变量')

当未知变量为系统默认变量时,未知变量的输入可以省略。当求解由n个代数方程组成的方程组时调用的格式是:

[未知变量组]=solve('代数方程组','未知变量组')

未知变量组中的各变量之间,代数方程组的各方程之间用逗号分隔,如果各未知变量是由系统默认的,则未知变量组的输入可以省略。

实例1、求解高次符号方程和方程对y的解。

>> syms x y z a b                             %定义符号变量

>> solve(x^4-3*a*x^2+4*b)                   %求解高次方程

ans =

  1/2*(6*a+2*(9*a^2-16*b)^(1/2))^(1/2)

 -1/2*(6*a+2*(9*a^2-16*b)^(1/2))^(1/2)

  1/2*(6*a-2*(9*a^2-16*b)^(1/2))^(1/2)

 -1/2*(6*a-2*(9*a^2-16*b)^(1/2))^(1/2)

>> solve(x^3+2*a*x*y-3*b*y^2,y)             %对指定变量求解方程

ans =

 1/6/b*(2*a+2*(a^2+3*b*x)^(1/2))*x

 1/6/b*(2*a-2*(a^2+3*b*x)^(1/2))*x

实例2、求解多元高次方程组

>> [x,y]=solve('x^3+2*x*y-3*y^2-2','x^3-3*x*y+y^2+5')   %求解多元高次方程组

x =

  1.8061893129091900210106914427639+1.1685995398225344682988775209345*i

  .51233671712308192620449202726936+1.0694475803263816285960240820218*i

 -1.2247760300322719472151834700333+.35066213508454219362158900429401*i

 -1.2247760300322719472151834700333-.35066213508454219362158900429401*i

  .51233671712308192620449202726936-1.0694475803263816285960240820218*i

  1.8061893129091900210106914427639-1.1685995398225344682988775209345*i

y =

  1.8086294126483514370835126464657+1.9432962587476317909683476452237*i

  .17307087932198664953847299268063-.78620181218420502898925154555661*i

 -.61451279197033808662198563914677-.89207785198625780793629825881329*i

 -.61451279197033808662198563914677+.89207785198625780793629825881329*i

  .17307087932198664953847299268063+.78620181218420502898925154555661*i

  1.8086294126483514370835126464657-1.9432962587476317909683476452237*i

实例3、求解方程组的解。

>> [x,y,z]=solve('x-2*y-4','x^2-2*x*y+y-z','x^2-y*z+z')

x =

 29/5-1/5*721^(1/2)

 29/5+1/5*721^(1/2)

y =

 9/10-1/10*721^(1/2)

 9/10+1/10*721^(1/2)

z =

 241/10-9/10*721^(1/2)

 241/10+9/10*721^(1/2)

实例4、求解超越方程的解。

>> solve('x*2^x-1')                  %求解超越方程

ans =

1/log(2)*lambertw(log(2))

注:lambertw是一个函数,lambertw(x)表示方程w*exp(w) = x的解w。其数值可以在命令窗口输入该函数得到。

>> lambertw(log(2))

ans =

0.       4444

二、符号线性方程(组)的求解

符号线性方程(组)的求解与数值线性方程(组)的求解方法相同,采用矩阵左除或函数linsolve,格式为:X=A\B 或 X=sym(A)\sym(B) 或X=linsolve(A,B)。其中A为线性方程组的系数矩阵,B为方程右侧的常数列矩阵。

实例5、求符号线性方程组的符号解。

>> A=sym('[1 2 3;-1 9 2;2 0 3]');          %定义符号矩阵A

>> B=[a;b;1];                         %定义符号矩阵B

>> x=A\B                            %求解方程

x =

  6/13*b+23/13-27/13*a

    3/13*b+5/13-7/13*a

 -4/13*b-11/13+18/13*a

三、非线性符号方程的求解

非线性符号方程(组)F(X)=0中X是一个向量,求解显示的结果也是一个向量。它不仅可以用调用solve函数求解,也可以调用函数fsolve求解,而函数fsolve不是MATLAB符号工具箱的函数,它位于优化工具箱内。

实例6、求解非线性符号方程组,用solve函数和fsolve函数起始点为x0=[0;0]各自求解。

(1)solve函数求解

>> syms x1 x2                                        %定义符号变量

>> [x1,x2]=solve('x1-3*x2=sin(x1)','2*x1+x2=cos(x2)','x1','x2') %求解方程组

x1 =

.49662797440907460178544085171994

x2 =

.67214622395756734146654770697884e-2

(2)fsolve函数求解

先在文件编辑窗口编写如下M文件,并存于系统的work目录下。

function F=myfun(x)

F=[x(1)-3*x(2)-sin(x(1));2*x(1)+x(2)-cos(x(2))];

然后在命令窗口求解:

>> x0=[0;0];                                  %设定求解初值

>> options=optimset('Display','iter');               %设定优化条件

>> [x,fv]=fsolve(@myfun,x0,options)              %优化求解

%MATLAB显示的优化过程

                                         Norm of      First-order   Trust-region

 Iteration  Func-count            f(x)          step         optimality    radius

     0          3               1                            2           1

     1          6      0.000423308            0.5         0.0617           1

     2          9      5.17424e-010     0.00751433      4.55e-005         1.25

     3         12      9.99174e-022    1.15212e-005      9.46e-011         1.25

Optimization terminated: first-order optimality is less than options.TolFun.

x =

    0.4966

    0.0067

fv =

  1.0e-010 *

    0.3161

    0.0018

四、常微分方程的符号解

含有自变量、未知函数和未知函数导数(或微分)的等式叫微分方程。描述自变量与函数关系的等式叫微分方程的初始条件。适合微分方程的函数叫微分方程的解。没有初始条件而求得的解叫微分方程的通解,通解中会包含有与方程阶数相同个数的积分常数C1、C2等;有初始条件且满足初始条件的解叫微分方程的特解,特解一般不含有积分常数。在MATLAB中,用dsolve函数求解微分方程或微分方程组,dsolve函数参数的输入共有三部分,微分方程、初始条件和自变量。格式是:

dsolve('微分方程','初始条件','自变量')

微分方程部分的输入与MATLAB符号表达式的输入基本相同,微分或导数的输入是用Dy、D2y、D3y、…来表示y的一阶导数、二阶导数、三阶导数、…。如果自变量是系统默认的,则自变量输入部分可省略。dsolve函数的输出部分是该方程(组)的解列表,如果dsolve函数找不到解析解,则系统显示一则错误信息。

实例7、求解微分方程组在无初始条件和有初始条件下的解。

(1)无初始条件求解

>> [x,y]=dsolve('D2x+Dy+3*x=cos(2*t)','D2y-4*Dx+3*y=sin(2*t)','t')

x =

1/5*cos(2*t)-1/2*C1*cos(t)+1/2*C2*sin(t)+1/2*C3*cos(3*t)-1/2*C4*sin(3*t)

y =

3/5*sin(2*t)+C1*sin(t)+C2*cos(t)+C3*sin(3*t)+C4*cos(3*t)

(2)有初始条件求解

>> [x,y]=dsolve('D2x+Dy+3*x=cos(2*t)','D2y-4*Dx+3*y=sin(2*t)','Dx(0)=1/5','x(0)=0','Dy(0)=6/5','y(0)=0','t')

x =

1/5*cos(2*t)-3/20*cos(t)+1/20*sin(t)-1/20*cos(3*t)+1/20*sin(3*t)

y =

3/5*sin(2*t)+3/10*sin(t)+1/10*cos(t)-1/10*sin(3*t)-1/10*cos(3*t)

 

这篇关于用matlab求解符号方程及符号方程组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/958861

相关文章

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

libsvm在matlab中的使用方法

原文地址:libsvm在matlab中的使用方法 作者: lwenqu_8lbsk 前段时间,gyp326曾在论坛里问libsvm如何在matlab中使用,我还奇怪,认为libsvm是C的程序,应该不能。没想到今天又有人问道,难道matlab真的能运行libsvm。我到官方网站看了下,原来,真的提供了matlab的使用接口。 接口下载在: http://www.csie.ntu.edu.

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数_matlab pmsm-CSDN博客

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

MATLAB层次聚类分析法

转自:http://blog.163.com/lxg_1123@126/blog/static/74841406201022774051963/ 层次聚类是基于距离的聚类方法,MATLAB中通过pdist、linkage、dendrogram、cluster等函数来完成。层次聚类的过程可以分这么几步: (1) 确定对象(实际上就是数据集中的每个数据点)之间的相似性,实际上就是定义一个表征

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区

MATLAB的fix(),floor()和ceil()函数的区别与联系

fix(x),floor(x)和ceil(x)函数都是对x取整,只不过取整方向不同而已。 这里的方向是以x轴作为横坐标来看的,向右就是朝着正轴方向,向左就是朝着负轴方向。 fix(x):向0取整(也可以理解为向中间取整) floor(x):向左取整 ceil(x):向右取整 举例: 4个数:a=3.3、b=3.7、c=-3.3、d=-3.7 fix(a)=3 fl