matlab的solve函数得不到数值解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab的solve函数得不到数值解相关的知识,希望对你有一定的参考价值。

先用solve,解得fai(例a=t1+t2+w+y1+y2)和seta(例如b=....)关于已知数的函数关系式,把已知数赋值进去,在用subs,例如fai=subs(a),
seta=subs(b),即可得到具体数值了。(指令你自己敲,不要复制我的,我的指令有输入法转换的问题,matlab是只认英文输入的指令,这个你是懂的)。
solve解你给的符号方程,只能解出关于已知数的代数式,即使你在先前赋了具体的值,也得不到具体的数值。
你也可以如一楼说的那样,别用带符号方程直接solve,而是把已知数直接数值化写入方程,再用solve(个人意见,希望参考。不知道是不是你想要的~亲~!~)
参考技术A matlab中的solve()可以得到方程(是指一般的方程组或方程)的解析解或精确解。如求复杂方程的数值解,可以数值分析的二分法,牛顿法等等来求解。

MATLAB常微分方程的数值解法

MATLAB常微分方程的数值解法

作者:凯鲁嘎吉 - 博客园
http://www.cnblogs.com/kailugaji/

一、实验目的

科学技术中常常要求解常微分方程的定解问题,所谓数值解法就是求未知函数在一系列离散点处的近似值。

二、实验原理

三、实验程序

  1. 尤拉公式程序

四、实验内容

选一可求解的常微分方程的定解问题,分别用以1, 4两种方法求出未知函数在

节点处的近似值,并对所求结果与分析解的(数值或图形)结果进行比较。

 

五、解答

1. 程序

求解初值问题

n=10

源程序:

euler23.m:

function [A1,A2,B1,B2,C1,C2]=euler23(a,b,n,y0)
%欧拉法解一阶常微分方程
%初始条件y0
h = (b-a)/n; %步长h
%区域的左边界a
%区域的右边界b
x = a:h:b; 
m=length(x);
 
%前向欧拉法
y = y0;
for i=2:m
    y(i)=y(i-1)+h*oula(x(i-1),y(i-1));  
    A1(i)=x(i);
    A2(i)=y(i);
end
plot(x,y,\'r-\');
hold on;
 
%改进欧拉法
y = y0;
for i=2:m
    y(i)=y(i-1)+h/2*( oula(x(i-1),y(i-1))+oula(x(i),y(i-1))+h*(oula(x(i-1),x(i-1)))); 
    B1(i)=x(i);
    B2(i)=y(i);
end
plot(x,y,\'m-\');
hold on;
 
%欧拉两步公式
y=y0;
y(2)=y(1)+h*oula(x(1),y(1));  
for i=2:m-1
    y(i+1)=y(i-1)+2*h*oula(x(i),y(i));
    C1(i)=x(i);
    C2(i)=y(i);
end
plot(x,y,\'b-\');
hold on;
 
%精确解用作图
xx = x;
f = dsolve(\'Dy=-3*y+8*x-7\',\'y(0)=1\',\'x\');%求出解析解
y = subs(f,xx); %将xx代入解析解,得到解析解对应的数值
 
plot(xx,y,\'k--\');
legend(\'前向欧拉法\',\'改进欧拉法\',\'欧拉两步法\',\'解析解\');

oula.m:
function f=oula(x,y)
f=-3*y+8*x-7;

  

2. 运算结果

    A1,A2为前向欧拉法在节点处的近似值,B1,B2为改进的欧拉法在节点处的近似值,C1,C2为欧拉公式法在节点处的近似值。

>> [A1,A2,B1,B2,C1,C2]=euler23(0,1,10,1)

A1 =

         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000    0.7000    0.8000    0.9000    1.0000


A2 =

         0         0   -0.6200   -0.9740   -1.1418   -1.1793   -1.1255   -1.0078   -0.8455   -0.6518   -0.4363


B1 =

         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000    0.7000    0.8000    0.9000    1.0000


B2 =

         0    0.0050   -0.6090   -0.9563   -1.1169   -1.1468   -1.0853   -0.9597   -0.7893   -0.5875   -0.3638


C1 =

         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000    0.7000    0.8000    0.9000


C2 =

         0         0   -0.2400   -0.9360   -0.5984   -1.3370   -0.3962   -1.5392    0.2473   -1.8076

>> [A1,A2,B1,B2,C1,C2]=euler23(0,1,10,1)

A1 =

         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000    0.7000    0.8000    0.9000    1.0000


A2 =

         0         0   -0.6200   -0.9740   -1.1418   -1.1793   -1.1255   -1.0078   -0.8455   -0.6518   -0.4363


B1 =

         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000    0.7000    0.8000    0.9000    1.0000


B2 =

         0    0.0050   -0.6090   -0.9563   -1.1169   -1.1468   -1.0853   -0.9597   -0.7893   -0.5875   -0.3638


C1 =

         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000    0.7000    0.8000    0.9000


C2 =

         0         0   -0.2400   -0.9360   -0.5984   -1.3370   -0.3962   -1.5392    0.2473   -1.8076

  

3. 拓展(方法改进、体会等)

从以上图形可以看出,在n=10时,改进的欧拉法精度更高,而欧拉两步法所求结果震荡不收敛,越接近1,震荡幅度越大,于是取n=100,时,结果如下所示:

n=1000时,结果如下图:

当n=100时,三种方法与解析解非常接近,当n=1000时,几乎四者位于一条线中,从实验结果看出,n越大时,结果越精确。

以上是关于matlab的solve函数得不到数值解的主要内容,如果未能解决你的问题,请参考以下文章

matlab使用solve函数提示得不到解

matlab的solve函数限定解的范围

matlab的solve用法

MATLAB 中如何用solve函数解数目不定的方程组???

MATLAB中solve函数最多解多少个方程

matlab solve函数的用法