怎样用MATLAB解决状态转移问题(例如商人过河问题)
function jueche=guohe
%%%%%%%%%%%%%%%%%%%%%%
程序开始需要知道商人和仆人数;
n=input('输入商人数目: ');
nn=input('输入仆人数目: ');
nnn=input('输入船的最大容量: ');
if nn>n
n=input(''输入商人数目:');
nn=input('输入仆人数目:');
nnn=input('输入船的最大容量:');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 决策生成
jc=1; %决策向量放在矩阵d中,jc为插入新元素的行标初始为1;
for i=0:nnn
for j=0:nnn
if (i+j0) % 满足条D={(u,v)|1<=u+v<=nnn,u,v=0,1,2}
d(jc,1:3)=[i,j,1];%生成一个决策向量立刻扩充为三维;
d(jc+1,1:3)=[-i,-j,-1]; % 同时生成他的负向量;
jc=jc+2; % 由于生成两个决策向量,则jc要向下移动两个; end
end
j=0;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 状态数组生成
kx=1; % 状态向量放在A矩阵中,生成方法同矩阵生成;
for i=n:-1:0
for j=nn:-1:0
if ((i>=j)&((n-i)>=(nn-j)))|((i==0)|(i==n))
% (i>=j)&((n-i)>=(nn-j)))|((i==0)|(i==n))为可以存在的状态的约束条件
A(kx,1:3)=[i,j,1]; %生成状态数组集合D `
A(kx+1,1:3)=[i,j,0];
kx=kx+2;
end
end
j=nn;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 将状态向量生成抽象矩阵
k=(1/2)*size(A,1);
CX=zeros(2*k,2*k);
a=size(d,1);
for i=1:2*k
for j=1:a
c=A(i,:)+d(j,:) ;
x=find((A(:,1)==c(1))&(A(:,2)==c(2))&(A(:,3)==c(3))) ;
v(i,x)=1; %x为空不会改变v值
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% dijstra算法
x=1; y=size(A,1);
m=size(v,1);
T=zeros(m,1);
T=T.^-1;
lmd=T;
P=T;
S=zeros(m,1);
S(x)=1;
P(x)=0; lmd(x)=0;
k=x;
while(1)
a=find(S==0);
aa=find(S==1);
if size(aa,1)==m
break;
end
for j=1:size(a,1)
pp=a(j,1);
if v(k,pp)~=0
if T(pp)>(P(k)+v(k,pp))
T(pp)=(P(k)+v(k,pp));
lmd(pp)=k;
end
end
end
mi=min(T(a));
if mi==inf
break;
else
d=find(T==mi);
d=d(1);
P(d)=mi;
T(d)=inf;
k=d;
S(d)=1;
end
end
if lmd(y)==inf
jueche='can not reach';
return;
end
jueche(1)=y;
g=2; h=y;
while(1)
if h==x
break;
end
jueche(g)=lmd(h);
g=g+1;
h=lmd(h);
end
jueche=A(jueche,:);
jueche(:,3)=[];
我把
sa=[];sb=[];
改成
sa=ones(40,2);
sb=ones(40,2);
能运行。不知道符合你要求吗。改后的程序在附件中有
%%%%%%%%%%%%%%%%%%%%%%
程序开始需要知道商人和仆人数;
n=input(‘输入商人数目:’,’12’);
nn=input(‘输入仆人数目:’,’12’);
nnn=input(‘输入船的最大容量:’,’20’);
if nn>n
n=input(‘输入商人数目:’,’23’);
nn=input(‘输入仆人数目:’,’23’);
nnn=input(‘输入船的最大容量:’,’34’);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 决策生成
jc=1; %决策向量放在矩阵d中,jc为插入新元素的行标初始为1;
for i=0:nnn
for j=0:nnn
if (i+j<=nnn)&(i+j>0) % 满足条D={(u,v)|1<=u+v<=nnn,u,v=0,1,2}
d(jc,1:3)=[i,j,1];%生成一个决策向量立刻扩充为三维;
d(jc+1,1:3)=[-i,-j,-1]; % 同时生成他的负向量;
jc=jc+2; % 由于生成两个决策向量,则jc要向下移动两个; end
end
j=0;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 状态数组生成
kx=1; % 状态向量放在A矩阵中,生成方法同矩阵生成;
for i=n:-1:0
for j=nn:-1:0
if ((i>=j)&((n-i)>=(nn-j)))|((i==0)|(i==n))
% (i>=j)&((n-i)>=(nn-j)))|((i==0)|(i==n))为可以存在的状态的约束条件
A(kx,1:3)=[i,j,1]; %生成状态数组集合D `
A(kx+1,1:3)=[i,j,0];
kx=kx+2;
end
end
j=nn;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 将状态向量生成抽象矩阵
k=(1/2)*size(A,1);
CX=zeros(2*k,2*k);
a=size(d,1);
for i=1:2*k
for j=1:a
c=A(i,:)+d(j,:) ;
x=find((A(:,1)==c(1))&(A(:,2)==c(2))&(A(:,3)==c(3))) ;
v(i,x)=1; %x为空不会改变v值
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% dijstra算法
x=1; y=size(A,1);
m=size(v,1);
T=zeros(m,1);
T=T.^-1;
lmd=T;
P=T;
S=zeros(m,1);
S(x)=1;
P(x)=0; lmd(x)=0;
k=x;
while(1)
a=find(S==0);
aa=find(S==1);
if size(aa,1)==m
break;
end
for j=1:size(a,1)
pp=a(j,1);
if v(k,pp)~=0
if T(pp)>(P(k)+v(k,pp))
T(pp)=(P(k)+v(k,pp));
lmd(pp)=k;
end
end
end
mi=min(T(a));
if mi==inf
break;
else
d=find(T==mi);
d=d(1);
P(d)=mi;
T(d)=inf;
k=d;
S(d)=1;
end
end
if lmd(y)==inf
jueche='can not reach';
return;
end
jueche(1)=y;
g=2; h=y;
while(1)
if h==x
break;
end
jueche(g)=lmd(h);
g=g+1;
h=lmd(h);
end
jueche=A(jueche,:);
jueche(:,3)=[];
写一个搜索才可以哦。
如何用Matlab求一元二次方程式解的个数以及解
1、首先打开Matlab软件,点击左上角的New Script按钮,如下图所示 2、接下来在弹出的界面中给新的脚本文件起一个名字,然后进行保存,如下图所示 3、接着我们在脚本文件中用input接收三个输入变量,这三个变量是让用户输入的,如下图所示,他们代表方程式中的a,b,c参数 4、然后我们运用b^2-4ac进行...
MATLAB怎么解方程?
用MATLAB求解方程的步骤如下:在MATLAB的Command Window中输入方程,例如:x^2+100*x+99=0。在MATLAB的Command Window中输入:x=solve('x^2+100*x+99=0','x'),然后按回车键。MATLAB就会求出方程的解。用MATLAB解一元三次方程的步骤如下:在MATLAB的Command Window中输入方程,例如:x^3+1=0。
用matlab解方程
可以使用MATLAB中的符号计算工具箱来解决方程问题。具体步骤如下:1. 定义方程:使用符号变量表示未知数,并定义方程。例如,如果要解一元二次方程ax² + bx + c = 0,可以使用syms定义符号变量x和系数a、b、c。然后使用eq函数定义方程。2. 解方程:使用solve函数解方程。将方程作为solve函数的...
如何用matlab解方程?
用matlab解二元二次方程组,可以直接用solve()函数来求解。例如:>>[x,y] = solve('x^2*y^2 - 2*x - 1 = 0','x^2 - y^2 - 1 = 0')运行结果 对于较复杂的方程,也可以用数值分析的方法,如fsolve()函数、二分法,牛顿法,求出其数值解。
如何用matlab求解常微分方程?matlab解常微分方程之符号解法介绍_百度...
1、首先得介绍一下,在matlab中解常微分方程有两种方法,一种是符号解法,另一种是数值解法。在本科阶段的微分数学题,基本上可以通过符号解法解决。2、用matlab解决常微分问题的符号解法的关键命令是dslove命令。该命令中可以用D表示微分符号,其中D2表示二阶微分,D3表示三阶微分,以此类推。值得注意的...
matlab怎么解方程
matlab怎么解方程方法如下:一般用matlab求解方程有两种方法:用软件自带的solve()函数、fsolve()函数、roots()函数等;利用数值分析的方法(如二分法,牛顿法等)自行编程其数值函数。
如何用matlab解方程组?
P(XY=0)=1,即X、Y都不是0的概率为0,P(X=1,Y=1)=P(X=-1,Y=1)=0,结合二维离散随机变量的条件分布律来做,X=-1条件下随机变量X的条件分布律之和为1,即P(Y=1|X=-1)+P(Y=0|X=-1)=1,由乘法公式P(AB)=P(B|A)P(A)可知,因为P(X=-1,Y=1)=0,所P(Y=1|X=-1)...
用matlab怎么解差分方程?
如何用matlab解差分方程?差分方程是指未知函数差分的方程,其一般形式为 F(t,yt,Δyt,Δy^2t,···,Δy^nt)=0 差分方程的通解是指含有相互独立的任意常数,且任意常数的个数等于方程的价数的解;差分方程的特解是指不含有任意常数的解;为了说明如何用matlab解差分方程问题,特举例:例1...
如何利用matlab求微分方程通解?
1、 打开Matlab软件-->点击新建脚本菜单,新建一个脚本文件用于编写微分方程求解程序。2、 输入微分方程求解程序-->点击保存-->点击运行。3、在matlab的命令窗口即可看到求解结果,是一个关于参数a,b的表达式 第二种方法:利用Matlab中的solver函数(包括ode45、ode23、ode15s等)来求解微分方程的数值解...
怎样用MATLAB解方程组啊?
可以用vpasolve求解。实现代码:for lambda=1:0.1:2 syms x qr=1.449*lambda.*(1-0.1416*lambda.^2).^3.0303;lambda1=vpasolve(1.57744*x*(1-0.1667*x.^2).^2.5==qr)end 运行结果 matlab解方程组lnx表示成log(x)而lgx表示成log10(x)1-exp(((log(y))\/x^0.5)\/(x-1))1...
和闹双黄: function jueche=guohe %%%%%%%%%%%%%%%%%%%%%% 程序开始需要知道商人和仆人数; n=input('输入商人数目:','12'); nn=input('输入仆人数目:','12'); nnn=input('输入船的最大容量:','20'); if nn>n n=input(...
新余市19677501857: matlab中怎么画状态转移图 - ?
和闹双黄: 首先在matlab画出曲线变化图,最好保存为*.tif格式.*.tif格式图片占用的空间小,图片显示清晰.在word中使用该图片的话,直接在word里面插入Visio对象.这样比在Visio中画好再插入到word里根规范,效果也更好. 打开word的插入->对象->visio绘图 得到一个visio对象.右键点击visio对象,选择打开就可以在visio中插入图片!在visio中编辑完成等就可以关闭visio文档,在word就可以看到编辑好图片!
新余市19677501857: 怎么用matlab解决下面问题,要程序 - ?
和闹双黄: 该问题可以这样来解决.1、用循环语句,求出当θ1=0到2π时的θ2、θ3、θ5、θ6的对应值.2、利用meshgrid()函数,对θ1和e数据平面网格化3、利用ω6的计算公式,计算对应θ1和e的ω6值.4、利用mesh()函数,绘出其θ1、e和ω6三维曲面图.
新余市19677501857: matlab 一步转移概率的问题 - ?
和闹双黄: 首先第一步先把P矩阵输入,代码为p=[,,;,,;,,];里面的数字省略.第二步:矩阵相乘,如果要到平稳分布,建议使用循环语句:pi=p; for i=1:10 pi=p*pi; end disp(pi); 回答完毕.
新余市19677501857: 状态空间转换为传递函数直接传递函数是多少 - ?
和闹双黄: 在线性系统的前提下,状态空间方程和传递函数是可以相互转化的,关系就是G(s)=C(sI-A)^{-1}B+D.即使是MIMO的,也刻意得到一组的传递函数.状态空间法和传统的传递函数法各有优势,一般来说,状态空间法可以更好地讨论有耦合的多输...
新余市19677501857: 线性定常连续系统状态转移矩阵的几种算法 - ?
和闹双黄: 分享到: 收藏推荐 薛薇贾红艳(自动化工程系)摘要:对线性定常连续系统状态转移矩阵的几种计算方法进行了比较.关键词:状态方程状态转移矩阵矩阵指数函数在对被控系统状态方程的求解过程中,最关键的问题是计算状态转移矩阵.对...
新余市19677501857: 动态规划如何设计状态转移方程 - ?
和闹双黄: 首先你要确定这道题是否可以用动态规划来做,即它是否满足最优化原理和无后效性原则.如果是,就开始设计: 一、确定问题的决策对象 二、对决策对象划分阶段 三、对各阶段确定状态变量 四、根据状态变量确定费用函数和目标函数 五、建立各阶段的状态变量的转移方程,写出状态转移方程 六、编程实现
新余市19677501857: 请教关于MATLAB语言的HMM工具箱的使用问题 - ?
和闹双黄: 我学它的时候老师讲HMM主要解决三个问题类型,评估问题,解码问题和机械学习.em(BW)算法用于解决第三个问题类型,用观测数据来训练模型参数.用哪个function得看你作业是属于哪种类型.而且要看你的模型是哪种,单纯的left to right模型的话状态转移矩阵中只保存相同状态的转移概率和对下一个状态的转移概率,其他的都是0.建议用kevin murphy的HMM工具箱,它应该是世界上使用率最高最有名的.
新余市19677501857: 在matlab上怎样实现信号的离散化处理 - ?
和闹双黄: 首先,计算机处理的信号均为离散化的信号.对于连续模拟信号的表达式,只要给定离散的时间参数,其得到的就是离散信号 例如 sin(2*pi*100*t) 这表示频率为100Hz的正弦信号 那么,令t = 1:0.1:100; y = sin(2*pi*100*t); 得到的就是离散的正弦信号y.
新余市19677501857: 怎样运用matlab解决最优化问题 - ?
和闹双黄: 打开matlab2014a程序,在主工具栏找到应用程序一栏,打开optimization选项.问题输入 在optimization程序中,首先根据不同的问题类型选择不同的模型,同时输入约束等.选择优化程序运行的条件 在最中间的一栏中添加优化程序运行的条件,如优化截止的标准,画图的要求等等.开始运算 点击start即可实现优化程序的运行,在图示的框中即可出现运行结果.5 查看帮助文件 在程序的最右边,是一个帮助文件,如果你有什么疑问,可以直接在帮助文件中查找.