用matlab求恰定方程组的解,matlab解非线性超定方程组-恰定方程组-欠定方程组.docx...

41528d3028836879cd698677c3999917.gifmatlab解非线性超定方程组-恰定方程组-欠定方程组.docx

Matlab解非线性超定方程组 3x+2/(5+y)=6, 4x+4/(5+y)=7, 9x+4/(8+y)=12 11x+2/(4+y)=15 x,y是未知数 -------------------- clc;clear; %其实楼主的问题可以等效为求最小值的问题,我使用的指标是典型的平方和最 小 xtt=[1,1]; f=@(x)(3*x(1)+2/(5+x(2))-6)^2+(4*x(1)+4/(5+x(2))- 7)^2+(9*x(1)+4/(8+x(2))-12)^2+(11*x(1)+2/(4+x(2))-15)^2; [x,fval]=fminsearch(f,xtt) ============================================================================== 求解线性方程组 solve,linsolve 例: A=[5 0 4 2;1 -1 2 1;4 1 2 0;1 1 1 1]; %矩阵的行之间用分号隔开,元素之间用逗号或空格 B=[3;1;1;0] X=zeros(4,1);%建立一个 4 元列向量 X=linsolve(A,B) diff(fun,var,n):对表达式 fun 中的变量 var 求 n 阶导数。 例如:F=sym( u(x,y)*v(x,y) ); %sym()用来定义一个符号表达式 diff(F); %matlab 区分大小写 pretty(ans) %pretty():用习惯书写方式显示变量;ans 是答案表达式非线性方程求解 fsolve(fun,x0,options) 其中 fun 为待解方程或方程组的文件名; x0 位求解方程的初始向量或矩阵; option 为设置命令参数 建立文件 fun.m: function y=fun(x) y=[x(1)-0.5*sin(x(1))-0.3*cos(x(2)), . x(2) - 0.5*cos(x(1))+0.3*sin(x(2))]; >>clear;x0=[0.1,0.1];fsolve(@fun,x0,optimset( fsolve )) 注: .为续行符 m文件必须以 function 为文件头,调用符为@;文件名必须与定义的函数名相 同;fsolve()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程。Matlab 求解线性方程组 AX=B 或 XA=B 在 MATLAB 中,求解线性方程组时,主要采用前面章节介绍的除法运算符“/”和 “\”。如: X=A\B 表示求矩阵方程 AX=B 的解; X=B/A 表示矩阵方程 XA=B 的解。 对方程组 X=A\B,要求 A 和 B 用相同的行数,X 和 B 有相同的列数,它的行 数等于矩阵 A 的列数,方程 X=B/A 同理。 如果矩阵 A 不是方阵,其维数是 m×n,则有: m=n 恰定方程,求解精确解;m>n 超定方程,寻求最小二乘解; mm。则方程组没有精确解,此时称方程组为超定方程组。线性超定方程组经常遇到的问题是数据的 曲线拟合。对于超定方程,在 MATLAB 中,利用左除命令(x=A\b)来寻求它 的最小二乘解;还可以用广义逆来求,即 x=pinv(A),所得的解不一定满足 Ax=b,x 只是最小二乘意义上的解。左除的方法是建立在奇异值分解基础之上, 由此获得的解最可靠;广义逆法是建立在对原超定方程直接进行 householder 变换的基础上,其算法可靠性稍逊与奇异值求解,但速度较快; 【例 7】 求解超定方程组 A=[2 -1 3;3 1 -5;4 -1 1;1 3 -13] A= 2 -1 3 3 1 -5 4 -1 1 1 3 -13 b=[3 0 3 -6]’; rank(A) ans= 3 x1=A\b x1= 1.0000 2.0000 1.0000 x2=pinv(A)*b x2= 1.0000 2.0000 1.0000 A*x1-b ans=1.0e-014 -0.0888 -0.0888 -0.1332 0 可见 x1 并不是方程 Ax=b 的精确解,用 x2=pinv(A)*b 所得的解与 x1 相同。 三.欠定方程组 欠定方程组未知量个数多于方程个数,但理论上有无穷个解。MATLAB 将寻求 一个基本解,其中最多只能有 m个非零元素。特解由列主元 qr 分解求得。 【例 8】 解欠定方程组 A=[1 -2 1 1;1 -2 1 -1;1 -2 1 5] A= 1 -2 1 1 1 -2 1 -1 1 -2 1 -1 1 -2 1 5 b=[1 -1 5]’ x1=A\b Warning:Rank deficient,rank=2 tol=4.6151e-015 x1= 0 -0.0000 0 1.0000 x2=pinv(A)*b x2= 0 -0.00000.0000 1.0000 四.方程组的非负最小二乘解 在某些条件下,所求的线性方程组的解出现负数是没有意义的。虽然方程组可 以得到精确解,但却不能取负值解。在这种情况下,其非负最小二乘解比方程 的精确解更有意义。在 MATLAB 中,求非负最小二乘解常用函数 nnls,其调用 格式为: (1)X=nnls(A,b)返回方程 Ax=b 的最小二乘解,方程的求解过程被限制在 x 的条件下; (2)X=nnls(A,b,TOL)指定误差 TOL 来求解,TOL 的默认值为 TOL=max(size(A))*norm(A,1)*eps,矩阵的-1 范数越大,求解的误差越大; (3)[X,W]=nnls(A,b) 当 x(i)=0 时,w(i)0 时,w(i)0,同时返回一 个双向量 w。 【例 9】求方程组的非负最小二乘解 A=[3.4336 -0.5238 0.6710 -0.5238 3.2833 -0.7302 0.6710 -0.7302 4.0261]; b=[-1.000 1.5000 2.5000]; [X,W]=nnls(A,b) X= 0 0.6563 0.6998 W= -3.6820 -0.0000 -0.0000 x1=A\b x1=

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非线性微分方程组是在实际问题中经常遇到的一类问题,求解非线性微分方程组是数学研究和应用领域中的重要问题。使用MATLAB求解非线性微分方程组有多种方法,本文着重介绍基于龙格库塔的数值微分算法。 1. 引言 龙格库塔方法是常见的求解常微分方程初值问题的数值方法,其具有精度高、收敛性好等优点,被广泛应用于各个领域。对于非线性微分方程组,可以扩展龙格库塔方法求解。 2. 龙格库塔方法 对于如下形式的常微分方程初值问题: $$y'=f(t,y),\ y(t_0)=y_0$$ 我们可以采用龙格库塔方法求得数值,其中通过多步预测和多步校正,得到下一步的数值。向前Euler方法为一阶方法,而龙格库塔方法高阶,一般将四阶龙格库塔方法应用于常微分方程。 3. 非线性微分方程组 对于非线性微分方程组,可以将其转化为常微分方程初值问题的形式,然后应用龙格库塔方法求解。假设有如下形式的n阶微分方程组: $$y^{(n)}=f(t,y,y',\ldots,y^{(n-1)})$$ 定义$z_1=y$,$z_2=y'$,$\ldots$,$z_n=y^{(n-1)}$,则转化为以下形式: $$\begin{cases}z_1'=z_2 \\ z_2'=z_3 \\ \ldots \\ z_{n-1}'=z_n \\ z_n'=f(t,z_1,z_2,\ldots,z_n)\end{cases}$$ 使用龙格库塔方法,可得到: $$\begin{cases}z_1^{(1)}=z_1(t_n)+\frac{1}{6}(k_{11}+2k_{21}+2k_{31}+k_{41})\Delta t \\ z_2^{(1)}=z_2(t_n)+\frac{1}{6}(l_{11}+2l_{21}+2l_{31}+l_{41})\Delta t\\ \ldots \\ z_n^{(1)}=z_n(t_n)+\frac{1}{6}(q_{11}+2q_{21}+2q_{31}+q_{41})\Delta t\end{cases}$$ 其中$k_{ij}$、$l_{ij}$、$q_{ij}$等分别为预估值和校正值,根据式子计算即可。 4. MATLAB求解非线性微分方程组 对于复杂的非线性微分方程组,使用MATLAB求解非常方便。在MATLAB中,可以使用ode45等求解微分方程的函数,也可以自己编写程序使用龙格库塔方法求解。 使用ode45函数求解非线性微分方程组的代码如下: function dydt = f(t,y) ... end [t,y] = ode45(@f,[t0,t1],y0); 其中,t0与t1为时间区间,y0为初值,而@f则是对应的微分方程组函数。 使用自己编写的程序求解非线性微分方程组的代码也非常简单,以下是实现程序的代码: function [t,z] = RungKutta(t0,t1,z0,h) t = (t0:h:t1)'; n = size(z0,1); z = zeros(n,length(t)); z(:,1) = z0; for i = 1:length(t)-1 k1 = f(t(i),z(:,i)); k2 = f(t(i)+h/2,z(:,i)+h*k1/2); k3 = f(t(i)+h/2,z(:,i)+h*k2/2); k4 = f(t(i)+h,z(:,i)+h*k3); z(:,i+1) = z(:,i)+(k1+2*k2+2*k3+k4)*h/6; end end 此程序实现的是龙格库塔方法的四阶算法,输入参数包括区间起始时间$t0$和结束时间$t1$,初始状态$z0$,步长h,输出结果为时间序列$t$和对应的状态$z$。 5. 总结 使用MATLAB求解非线性微分方程组有多种方法,其中基于龙格库塔的数值微分算法是一种精度高、收敛性好的算法。本文介绍了如何使用龙格库塔方法求解非线性微分方程组,并提供了两种不同的实现方式。在应用中,应根据具体情况选择最适合的算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值