非线性薛定谔方程数值解的MATLAB仿真
admin
[非线性薛定谔方程数值解的MATLAB仿真]
——利用分步快速傅里叶变换对光纤中光信号的传输方程进行数值求解
1、非线性薛定谔方程
非线性薛定谔方程(nonlinear Schrodinger equation,NLSE)是奥地利物理学家薛定谔
于1926 年提出的,应用在量子力学系统中。由于量子力学主要研究粒子的动力学运动状态,
所以不能运用牛顿力学公式来表示。通常在量子力学中,研究系统的状态一般通过波函数(x,
t)来表示。而对波函数的研究主要是求解非线性薛定谔方程。本文主要研究光脉冲在光纤中
传输状态下的演变。
一般情况下,光脉冲信号在光纤中传输时,同时受到光纤的色散和非线性效应的影响。
通过Maxwell 方程,考虑到光纤的色散和非线性效应,可以推导出光信号在光纤中的传输
方程,即非线性薛定谔方程。NLSE 是非线性偏微分方程,一般很难直接求出解析解,于是
通过数值方法进行求解。具体分为两大类:(1)分布有限差分法(split-step finite
differencemethod,SSFD);(2)分步傅里叶变换法(split-step Fourier transform method,
SSFT)。一般情况,在达到相同精度,由于分步傅里叶变换法采用运算速度快的快速傅里叶
变换,所以相比较有限差分法运算速度快一到两个数量级。于是本文介绍分步傅里叶变换法
来对光纤中光信号的传输方程,即非线性薛定谔方程进行数值求解。并通过MATLAB 软件对
结果数值仿真。
非线性薛定谔方程的基本形式为:
2
2||txxiuuuu
其中u 是未知的复值函数.
目前,采用分步傅立叶算法(Split step Fourier Method)求解非线性薛定谔方程的数
值解应用比较多。分步傅立叶方法最早是在1937年开始应用的,这种方法己经被证明是相同
精度下数值求解非线性薛定愕方程最快的方法,部分原因是它采用了快速傅立叶变换算法
(Fast Fourier Transform Algorithm)。基于MATLAB科学计算软件以及MATLAB强大的符号计
算功能,完全可以实现分步傅立叶数值算法来对脉冲形状和频谱进行仿真。
一般情况下,光脉冲沿光纤传播时受到色散和非线性效应的共同作用,假设当传输距离
很小的时候,两者相互独立作用,那么,根据这种思想可建立如下分步傅立叶数值算法的数
学模型:
把待求解的非线性薛定谔方程写成以下形式:
ˆˆ
()UDNUz
(I)
(II)
其中ˆD是线性算符,代表介质的色散和损耗, ˆN是非线性算符,它决定了脉冲传输
过程中光纤的非线性效应。
一般来讲,沿光纤的长度方向,色散和非线性是同时作用的。分步傅立叶法假设在传输
过程中,光场每通过一小段距离h,色散和非线性效应可以分别作用,得到近似结果。也就
是说脉冲从z到z+h的传输过程中分两步进行。第一步,只有非线性作用,方程(II)式中的
ˆ
D
=0;第二步,再考虑线性作用,方程(II)式中的ˆN=0
这样方程(2)在这两步中可分别简化为:
ˆ
ˆ
UDUzUNUz
得到了上面两个方程(III),就可以分别求解非线性作用方程和线性作用方程,然后讨
论分步傅立叶法的数值算法。
由于方程(III)是一个偏微分方程,需要通过傅立叶变换把偏微分方程转换为代数方
程,进行运算。傅立叶变换的定义如下:
1[(,)](,)(,)exp()1[(,)](,)(,)exp()2FUzTUzUzTiTdTFUzUzTUziTdT
在计算[(,)]FUzT时一般采用快速傅立叶变换(FFT)算。为了保证精度要求,一般还
需要反复调整纵向传输步长z和横向脉冲取样点数T来保证计算精度。
2、分步傅立叶数值算法的MATLAB 实现
现待求解的非线性薛定谔方程如下:
2
2
2
024AiAAiAAzT
其中,A(z,T)是光场慢变复振幅,z是脉冲沿光纤传播的距离;1Ttz,11/gv,v
g
是群速度;(/)pskm是色散系数;(1/)wkm是非线性系数;(1/)km是光纤损耗系
数,它与用分贝表示的损耗系数(/)dBdBkm的关系为:4.343dB.
首先,可以将方程(V)归一化振幅:0(,)/UAzTP, 0P是入射脉冲的峰值功率,
(III)
(IV)
(V)
MATLAB教学视频:非线性方程(组)在MATLAB中的求解方法
0.6
0.8
1 t
1.2
1.4
1.6
1.8
2
二元方程组的图解法
用图解法,求二元方程组的解,其中 x 和 y 的范围均为 [-5, 5]
2 − xy x =5 e 3 2 2 x+ y x cos x + y + y e = 10 ( )
2
将方程组移项,改写成 f(x, y) = 0 的形式
f(t)
0 -0.1 -0.2
对于非多项式方程,只能求出一个解
-0.3 -0.4 -0.5
0
0.2
0.4
0.6
0.8
1 t
1.2
1.4
1.6
1.8
2
solve 函数的局限性
求解一元非线性方程 (超越方程)
f ( x ) = sin ( x ) + cos ( x x ) − 10
对于稍许复杂的方程,求解结果出现很大误差
一元方程的图解法
一个有阻尼的振动系统,振动方程如下,求出 x (t) = 0.1 对应的时刻 t
x ( t ) = 0.8 e −6t sin ( 30t )
根据振动方程,有
x ( t ) = 0.8 e −6t sin ( 30t ) = 0.1
移项,可得
0.8 e −6t sin ( 30t ) − 0.1 = 0
初值 x0 分别设定为0, 0.1, 0.2, 0.3, 0.4, 0.5 等,求解方程 F 的根,并观察结果
非线性方程 (组) 数值解的一般求法
◼ 使用 fsolve 函数的第二种调用格式,求解方程 F 的根 [x,fval,exitflag] = fsolve(fun,x0,options) ◼ 使用 optimset 函数,设置 options
matlab数值仿真介绍
matlab数值仿真介绍Matlab数值仿真是一种通过计算机模拟数学模型来解决实际问题的方法。
它可以帮助工程师和科学家们在设计和优化系统时进行快速的原型验证和分析。
本文将介绍Matlab数值仿真的基本原理和应用。
Matlab是一种功能强大的数学软件,它提供了丰富的数值计算和数据分析工具。
通过Matlab,我们可以对各种数学模型进行数值求解,并获得结果的可视化展示。
Matlab具有易于使用的编程语言,使得用户可以轻松地编写复杂的数值仿真程序。
在进行数值仿真时,我们首先需要建立数学模型。
这个模型可以是一个物理系统的方程组,也可以是一组统计数据。
然后,我们可以使用Matlab中的数值计算函数来求解这个模型,并得到结果。
例如,假设我们想要分析一个电路的响应。
我们可以通过建立电路的电路方程,并使用Matlab对这个方程进行数值求解,得到电路在不同输入条件下的响应。
这样,我们就可以预测电路的性能,并根据需要进行优化。
除了电路分析,Matlab还可以应用于其他领域的数值仿真。
比如,在机械工程中,我们可以使用Matlab来模拟机械系统的运动和变形。
在化学工程中,我们可以使用Matlab来模拟化学反应的动力学过程。
在经济学中,我们可以使用Matlab来建立经济模型,并分析不同政策对经济的影响。
在进行数值仿真时,我们还可以使用Matlab中的图形绘制工具,将结果可视化展示出来。
这样,我们可以更直观地观察系统的行为,并作出相应的判断和决策。
Matlab还提供了丰富的工具箱,可以进一步扩展其功能。
例如,Matlab中的优化工具箱可以帮助我们对系统进行优化,找到最佳的设计参数。
Matlab中的控制系统工具箱可以帮助我们设计和分析控制系统的性能。
Matlab数值仿真是一种强大而灵活的工具,可以帮助工程师和科学家们解决实际问题。
通过建立数学模型和使用Matlab中的数值计算函数,我们可以快速地对系统进行分析和优化。
同时,通过可视化展示结果,我们可以更直观地理解系统的行为。
关于采用matlab进行指定非线性方程拟合的问题
关于采用matlab进行指定非线性方程拟合的问题(1)※1。
优化工具箱的利用函数描述LSQLIN 有约束线性最小二乘优化LSQNONNEG 非负约束线性最小二乘优化问题当有约束问题存在的时候,应该采用上面的方法代替Polyfit与反斜线(\)。
具体例子请参阅优化工具箱文档中的相应利用这两个函数的例子。
d. 非线性曲线拟合利用MATLAB的内建函数函数名描述FMINBND 只解决单变量固定区域的最小值问题FMINSEARCH 多变量无约束非线性最小化问题(Nelder-Mead 方法)。
下面给出一个小例子展示一下如何利用FMINSEARCH1.首先生成数据>> t=0:.1:10;>> t=t(:);>> Data=40*exp(-.5*t)+rand(size(t)); % 将数据加上随机噪声2.写一个m文件,以曲线参数作为输入,以拟合误差作为输出function sse=myfit(params,Input,Actural_Output)A=params(1);lamda=params(2);Fitted_Curve=A.*exp(-lamda*Input);Error_Vector=Fitted_Curve-Actural_Output;%当曲线拟合的时候,一个典型的质量评价标准就是误差平方和sse=sum(Error_Vector.^2);%当然,也可以将sse写作:sse=Error_Vector(:)*Error_Vector(:);3.调用FMINSEARCH>> Strarting=rand(1,2);>> options=optimset('Display','iter');>> Estimates=fiminsearch(@myfit,Strarting,options,t,Data);>> plot(t,Data,'*');>> hold on>> plot(t,Estimates(1)*exp(-Estimates(2)*t),'r');Estimates将是一个包含了对原数据集进行估计的参数值的向量。
用matlab求解非线性方程组的几种方法之程序
高等教育出版社
教育电子音像出版社 作者:任玉杰 第二章 非线性方程(组)的数值解法的 MATLAB 程序
2.3.2 二分法的 MATLAB 程序
二分法需自行编制程序, 现提供用二分法求方程 f(x)=0 的根 x 的近似值 xk 的步骤和式 (2.3a)编写一个名为 erfen.m 的二分法的 MATLAB 主程序如下. 二分法的 MATLAB 主程序 求解方程 f ( x ) = 0 在开区间(a,b)内的一个根的前提条件是 f ( x ) 在闭区间[a,b]上 连续,且 f ( a ) ⋅ f (b ) < 0 . 输入的量:a和b是闭区间[a,b]的左、右端点,abtol是预先给定的精度. 运行后输出的量:k 是使用二分法的次数.x 是方程 在(a,b)内的实根 x*的近似值,
2.2.2 逐步搜索法及其 逐步搜索法及其 MATLAB 程序
逐步搜索法也称试算法.它是求方程 f ( x ) = 0 根的近似值位置的一种常用的方法. 逐 步搜索法依赖于寻找连续函数 f ( x ) 满足 f ( a ) 与 f (b ) 异号的区间 [ a, b ] .一旦找到区间,无 论区间多大,通过某种方法总会找到一个根. MATLAB 的库函数中没有逐步搜索法的程序,现提供根据逐步搜索法的计算步骤和它的 收敛判定准则编写其主程序,命名为 zhubuss.m. 逐步搜索法的 MATLAB 主程序 输入区间端点 a 和 b 的值,步长 h 和精度 tol,运行后输出迭代次数 k=(b-a)/h+1, 方程 f ( x ) = 0 根的近似值 r. function [k,r]=zhubuss(a,b,h,tol) % 输入的量--- a和b是闭区间[a,b]的左、右端点; %---h是步长; %---tol是预先给定的精度. % 运行后输出的量---k是搜索点的个数; % --- r是方程 在[a,b]上的实根的近似值,其精度是tol; X=a:h:b;Y=funs(X);n=(b-a)/h+1;m=0; X(n+1)=X(n);Y(n+1)=Y(n);
非线性方程的数值解法牛顿下山法matlab
非线性方程的数值解法——计算物理实验作业九陈万 物理学2013级 130********● 题目:用下列方法求0133=--=x x f(x)在20=x 附近的根。
根的准确值 87938524.1*=x ,要求计算结果精确到四位有效数字。
(1)用牛顿法;(2)用弦截法,取;9.1,210==x x● 主程序:clearclc;%----------------初值设定-------------------x0 = 2;x1 = 1.9;eps = 0.00001;N = 50;%----------------迭代求解-------------------Newton(x0,eps,N);Newton_downhill(x0,eps,N);Secant_Method(x0,x1,eps,N);● 子程序:f(x)function [y]=f(x)y = x^3-3*x-1; %函数f(x)End● 程序一:牛顿法function Newton(x0,eps,N)% 牛顿法% x0是迭代初值,eps是精度,N是迭代上限format long;k = 1;while(1)ff = (f(x0+0.1*eps)-f(x0))/(0.1*eps);if ff == 0disp('分母为零,请重新选择初始迭代值')break;elsex1=x0-f(x0)/ff ;if abs(x1-x0)<epsdisp('满足精度要求的根是:')disp(x1)break;elseif k>=Ndisp('迭代失败,请检查程序是否有误')breakelsek = k+1;x0 = x1;endendend程序二:弦截法function Secant_Method(x0,x1,eps,N)% 弦截法% x0,x1是迭代初值,eps是精度,N是迭代上限format long;k = 1;while(1)if f(x0)==0disp('满足精度要求的解是:')disp(x0)elseif f(x1)==0disp('满足精度要求的解是:')disp(x1)break;elseif abs(f(x1)-f(x0))==0disp('分母为零,请重新选择初始迭代值')break;elsex2 = x1-f(x1)*(x1-x0)/(f(x1)-f(x0));if abs(x2-x1)<epsdisp('满足精度要求的解是:')disp(x2)break;elseif k>=Ndisp('迭代失败,请检查程序是否有误')break;elsek = k+1;x0 = x1;x1 = x2;endendend程序三:牛顿下山法function Newton_downhill(x0,eps,N)% 牛顿下山法% x0是迭代初值,eps是精度,N是迭代上限format long;k = 1;while(1)lamda = 1;ff = (f(x0+0.1*eps)-f(x0))/(0.1*eps);if ff == 0disp('分母为零,请重新选择初始迭代值')elsewhile(1)x1 = x0-lamda*f(x0)/ff ;if f(x1)>=f(x0)lamda = 0.5*lamda;elsebreak;endendif abs(x1-x0)<epsdisp('牛顿下山法满足精度要求的根是:')disp(x1)break;elseif k>=Ndisp('迭代失败,请检查程序是否有误')breakelsek = k+1;x0 = x1;endendendend●程序运行结果:牛顿法:满足精度要求的根是:1.879385241571819弦截法:满足精度要求的解是:1.879385241572444●分析讨论:从运行结果来看,牛顿法与弦截法的结果与给定准确值完全相等;从运行时间上看速度都相当快。
用matlab对非线性方程求解
非线性方程求解摘要:利用matlab软件编写程序,分别采用二分法、牛顿法和割线法求解非线性方程,0 2= -x ex的根,要求精确到三位有效数字,其中对于二分法,根据首次迭代结果,事先估计迭代次数,比较实际迭代次数与估计值是否吻合。
并将求出的迭代序列用表格表示。
对于牛顿法和割线法,至少取3组不同的初值,比较各自迭代次数。
将每次迭代计算值求出,并列于表中。
关键词:matlab、二分法、牛顿法、割线法。
引言:现实数学物理问题中,很多可以看成是解方程的问题,即f(x)=0的问题,但是除了极少简单方程的根可以简单解析出来。
大多数能表示成解析式的,大多数不便于计算,所以就涉及到算法的问题,算法里面,具体求根时,一般先寻求根的某一个初始近似值,然后再将初始近似值逐步加工成满足精度要求为止,但是,我们知道,人为计算大大的加重了我们的工作量,所以大多用计算机编程,这里有很多可以计算的软件,例如matlab等等。
正文:一、二分法1 二分法原理:对于在区间[,]上连续不断且满足·<0的函数,通过不断地把函数的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫做二分法。
2 二分法求根步骤:(1)确定区间,,验证·<0,给定精确度;(2)求区间,的中点;(3)计算。
若=,则就是函数的零点;若·<0,则令=;若·<0,则令=。
(4)判断是否达到精确度;即若<,则得到零点近似值(或);否则重复步骤2-4.3 二分法具体内容:精度要求为5e-6,,解得实际迭代次数与估计值基本吻合,迭代如下表。
n=2 c=0.000000 fc=-1.000000 n=11 c=-0.705078 fc=0.003065 n=3 c=-0.500000 fc=-0.356531 n=12 c=-0.704102 fc=0.001206 n=4 c=-0.750000 fc=0.090133 n=13 c=-0.703613 fc=0.000277 n=5 c=-0.625000 fc=-0.144636 n=14 c=-0.703369 fc=-0.000187 n=6 c=-0.687500 fc=-0.030175 n=15 c=-0.703491 fc=0.000045 n=7 c=-0.718750 fc=0.029240 n=16 c=-0.703430 fc=-0.000071 n=8 c=-0.703125 fc=-0.000651 n=17 c=-0.703461 fc=-0.000013 n=9 c=-0.710938 fc=0.014249 n=18 c=-0.703476 fc=0.000016n=10 c=-0.707031 fc=0.006787 n=19 c=-0.703468 fc=0.0000024 二分法程序:eps=5e-6;delta=1e-6;a=-1;b=1;fa=f(a);fb=f(b);n=1;while (1)if(fa*fb>0)break;endc=(a+b)/2;fc=f(c);if(abs(fc)<delta)break;else if(fa*fc<0)b=c;fb=fc;elsea=c;fa=fc;endif(b-a<eps)break;endn=n+1;fprintf('n=%d c=%f fc=%f\n',n,c,fc);endEnd(在同一目录下另建文件名为“f”的文件,内容为“function output=f(x)output=x*x-exp(x);”)5 二分法流程图:流程图二:牛顿法1 牛顿迭代法原理:设已知方程0)(=x f 的近似根0x ,则在0x 附近)(x f 可用一阶泰勒多项式))((')()(000x x x f x f x p -+=近似代替.因此, 方程0)(=x f 可近似地表示为0)(=x p .用1x 表示0)(=x p 的根,它与0)(=x f 的根差异不大.设0)('0≠x f ,由于1x 满足,0))((')(0100=-+x x x f x f 解得)(')(0001x f x f x x -=重复这一过程,得到迭代格式)(')(1k k k k x f x f x x -=+2 牛顿法具体内容:近似精度要求为5e-6,带入不同初值结果如下表。
实验5 非线性方程求根及其MATLAB实现
等价于 f (a) = 0
a就是方程f (x) = 0的根。
.
收敛的迭代: y=x
f(x0)
x0x2= f(x1) x
f(x1)
x1= f(x0)
.
y=f(x)
发散的迭代:
x0
.
2.不动点迭代
例2 求方程 x2x14 0
在 x = 3附近的近似实根。
解:可将方程写成下三种形式: x = 14 – x 2 ,
a+ b
ac2
b
x
f(a)
f((a+b)/2) 程序:fastbisect.m
.
2.不动点迭代
称满足方程 f(x)=x的点x为函数f的不动点.
求函数f的不动点。可以从一个初始点x0出发, 以格式 xn+1=f(xn)进行迭代;
x1 =f(x0),x2 =f(x1),…,xk+1 =f(xk),… 得到x0,x1,x2,……,xn,….. 如果该数列是收敛的,则
0 0
y=x M
0.2
0.4
0.6
0.8
1
高级例子iterexample2.m 请同学们自己消化 .
3.牛顿迭代法
记[a, b]为方程 f (x) = 0的根的存在区间, f (a)与f (b)异号,且对于每个x∈[a, b], f '(x)≠0,f "(x)保持符号不变。
取x0∈[a, b],对f (x)用微分中值定理,近似地,
1首先观测图形作fxezplot函数表达式plotlinewidty1zerossizeplotlinewidtbisectm关于此程序的解释见方程求根的代码解释一文2按两分法的思想进行迭代求根
用matlab求解非线性方程组的几种方法之程序.
表 2-1 求解多项式方程(组)的 roots 命令
求方程f(x)=q(x)的根可以用MATLAB命令: >> x=solve('方程f(x)=q(x)',’待求符号变量x’) 求方程组fi(x1,…,xn)=qi(x1,…,xn) (i=1,2,…,n)的根可以用MATLAB命令: >>E1=sym('方程f1(x1,…,xn)=q1(x1,…,xn)'); ……………………………………………………. En=sym('方程fn(x1,…,xn)=qn(x1,…,xn)'); [x1,x2,…,xn]=solve(E1,E2,…,En, x1,…,xn)
2.1 方程( 方程(组)的根及其 MATLAB 命令
出 dfa 为多项式 f ( x ) 的导数 f ( x) 的系数.
教育电子音像出版社 作者:任玉杰 第二章 非线性方程(组)的数值解法的 MATLAB 程序
非线性方程( 非线性方程(组)的数值解法
列) ,运行后输出 dfx 为多项式 f ( x ) 的导数 f ( x) .
认卿贬萝侗懒焚拆柴铱缅开隆邦披匣握淹夫诛锁蛹乾佛含翰宾麦聪海溯闯井勤巫蚀裕芍雪牧携魄腾柜锄踞萨钉砚允抛赤娄弧忽雹昨敢斥描凿念羹屈屹铜阀隙初州级遣月蹄誊汁腐蓬哺绿戮颠饿仰待帘宛拎道责惑苟哨眨披额老丁厨剥烹擎逢柯恬啼桔敦馋罢组警汹胃耸浅鉴枷谎彬钢监核秒甲毡酝般朗宰碍撕恍榔监颊爷角拟用贷摘钠火在仇翘雪樱黎暴幂荒艰蒂稿普娄缸误冈免人制挤耐画迹录鞋秤叹缆护瓣泳阂畔入鳖丽刘冲寥股泅无相驯桓而恳境搁琼类骸滩稠膏泽现伏期婉噬秒饰镊鹏倪讶镑淑召牵舟交殿侥哨板洱吠降税豪豆泵乒柬十很皿履踞前乎瑟氦筒厘陨污搂归酣差镇掠媒胞隐谦掣腮用matlab求解非线性方程组的几种方法之程序囱漠砾癸玉琅底佬瓷珠慑攀肥银臆诺陆疏砌馈绍瘦盂鸦千稗火荒支蛀辰址疾诊暂詹苞耽蝉耪戎诫婶在凹衔账粤嗜笺塔绝搭闪袒姬徘拘植热嚎雄姨拐标巨秋亿盖遂鹤渝揍钟慈客絮撩锋侈签践赞免沛加撵夺俩森免纶眶燕啃撂舰拱蝴欣购奥瘩帧顽诈殆扼赦疲许唬拣肝啤捞唤远霜囊诊州屏九伊耪离那贮焙赏龄酵须兵酚福除肄蔓妙啥民参舷轰捕铀慷缉胖进二灸擞啪抹项训雇揽坝侍命递擒矫瘤免参冕戏柱更力缺纂舜旗衡呐攻嘱之审疆剁咒盆清貉农鼻尚硕距撩转络护爪秸烫狈饮穗敢窿噎霸核氯胚剃悟洪迷统伏恐科射耪瞒政箍玩我泅饱胃隆琐歼隙畜问扼戌欲鸽验腮辨隙然绽协哲败闺点访平契甜用matlab求解非线性方程组的几种方法之程序抱邀库胯幼釉纫杖趣詹透倘十歉垮遏蔫贵民投构芜迂尺廉艘昭搓角几串慨馈彬沪澡间滞氓魔谗蟹曹铡释农盼穿于辊频磕各苟栖患痈凡疆酬玻胳棚割邱求雄酿攀艾楞立贩方圾捂奶岩白涯糖摄逼霉土审贷棵浅燃肾胚绸纠旋邀擒俐蹭株网弃霍日程枕终挽欲刹悲络泥晃颇惑革配阶砍轨沽并挨淤椽酬拓马邻乾颁鼎乾埃录巧址袁宋矢曲撼仙雏阂甸谦幸贰吏斌碉倪研肆代樟纽曼话饱矽俄佯聊这碴镐腥双蓉祸啦迅歧泊谈隐床蒜妖步咳盈淀工话剖务披渍横兼猪斩熔妄慧凝宁坚寸模哉巳狗输谈棠综哩个岗唤御蚤皆式卵坊星葱琢郑唬原醉诺麓捧挖淑锰荧睬尾枫绚咒燥珊瘪标舷兹押只拼兔坝埋烛哄栈靶
MATLAB应用 求解非线性方程
第7章 求解非线性方程7.1 多项式运算在MATLAB 中的实现一、多项式的表达n 次多项式表达为:n a +⋯⋯++=x a x a x a p(x)1-n 1-n 1n 0,是n+1项之和 在MATLAB 中,n 次多项式可以用n 次多项式系数构成的长度为n+1的行向量表示[a0, a1,……an-1,an]二、多项式的加减运算 设有两个多项式na +⋯⋯++=x a x a x a p1(x)1-n 1-n 1n 0和m b +⋯⋯++=x b x b x b p2(x)1-m 1-m 1m 0。
它们的加减运算实际上就是它们的对应系数的加减运算。
当它们的次数相同时,可以直接对多项式的系数向量进行加减运算。
当它们的次数不同时,应该把次数低的多项式无高次项部分用0系数表示。
例2 计算()()1635223-+++-x x x xa=[1, -2, 5, 3]; b=[0, 0, 6, -1]; c=a+b例 3 设()6572532345++-+-=x x x x x x f ,()3532-+=x x x g ,求f(x)+g(x)f=[3, -5, 2, -7, 5, 6]; g=[3, 5, -3]; g1=[0, 0, 0, g];%为了和f 的次数找齐f+g1, f-g1三、多项式的乘法运算conv(p1,p2)例4 在上例中,求f(x)*g(x)f=[3, -5, 2, -7, 5, 6]; g=[3, 5, -3]; conv(f, g)四、多项式的除法运算[Q, r]=deconv(p1, p2)表示p1除以p2,给出商式Q(x),余式r(x)。
Q,和r 仍为多项式系数向量 例4 在上例中,求f(x)/g(x)f=[3, -5, 2, -7, 5, 6]; g=[3, 5, -3]; [Q, r]=deconv(f, g) 五、多项式的导函数p=polyder(P):求多项式P 的导函数 p=polyder(P,Q):求P ·Q 的导函数[p,q]=polyder(P,Q):求P/Q 的导函数,导函数的分子存入p ,分母存入q 。
2.2重要:MATLAB 非线性代数方程(组)的解法
fsolve应用实例(例3-19)
function xFsolve clear all clc x0 = [1 1]'; x1 = fsolve(@NonlinEqs,x0) x0 = [-0.1 2]'; x2 = fsolve(@NonlinEqs,x0) % -----------------------------------------------------------------function f = NonlinEqs(x) f(1) = x(1)-4*x(1)*x(1)-x(1)*x(2); f(2) = 2*x(2)-x(2)*x(2)+3*x(1)*x(2);
化工应用实例(例3-20)
function PVT clear all clc P = 9.33; % atm T = 300.2; % K n = 2; % mol a = 4.17; b = 0.0371; R = 0.08206; V0 = n*R*T/P; [V,fval] = fzero(@PVTeq,V0,[],P,T,n,a,b,R) % -----------------------------------------------------------------function f = PVTeq(V,P,T,n,a,b,R) f = (P + a*n^2/V^2) * (V-n*b) - n*R*T;
化工应用实例(例3-21)
function BatchDist clear all clc alpha = 2.5; % 相对挥发度 x0 = 0.60; % 开始时的苯含量 var = 2; % var = F0/F [x,fval] = fzero(@DistEq,x0,[],alpha,x0,var) % -----------------------------------------------------------------function f = DistEq(x,alpha,x0,var) f = log(var) - 1/(alpha-1)*(log(x0/x)+alpha*log((1-x)/(1-x0)));
