求程序 在matlab上用Dijkstra和Floyd算法求出v1到v8的最短路径。。

求程序 在matlab上用Dijkstra和Floyd算法求出v1到v8的最短路径。。,第1张

function [ distance, path] = Dijkstra( W,st,e )  

    n=length(W);

    D = W(st,:);  

    visit= ones(1:n); 

    visit(st)=0;  

    parent = zeros(1,n); 

    path =[];  

    for i=1:n-1  

        temp = [];  

        for j=1:n  

           if visit(j)  

               temp =[temp D(j)];  

           else  

               temp =[temp inf];  

           end

        end

        [~,index] = min(temp);  

        visit(index) = 0;  

         for k=1:n  

            if D(k)>D(index)+W(index,k)  

               D(k) = D(index)+W(index,k);  

               parent(k) = index;  

            end  

        end 

    end  

    distance = D(e);

    t = e;  

    while t~=st && t>0  

        path =[t,path];  

        p=parent(t);t=p;  

    end  

    path =[st,path];%最短路径 

endW = [0   3    10  Inf Inf Inf Inf Inf;

     3   0    Inf 5   Inf Inf Inf Inf;

     10  Inf  0   6   Inf Inf Inf Inf;

     Inf 5    6   0   4   Inf Inf Inf;

     Inf Inf Inf  4   0   9   5   Inf;

     Inf Inf Inf  Inf 9   0   3   4;

     Inf Inf Inf  10  5   3   0   6;

     Inf Inf Inf  Inf Inf 4   6   0    ];

 [distance,path]=Dijkstra(W,1,8);

 

 

 >> distance

distance =

    23

>> path

path =

     1     2     4     5     7     8

拉格朗日function y=lagrange(x0,y0,x)

n=length(x0);m=length(x);

for i=1:m

z=x(i);

s=00;

for k=1:n

p=10;

for j=1:n

if j~=k

p=p(z-x0(j))/(x0(k)-x0(j));

end

end

s=py0(k)+s;

end

y(i)=s;

end SOR迭代法的Matlab程序

function [x]=SOR_iterative(A,b)

% 用SOR迭代求解线性方程组,矩阵A是方阵

x0=zeros(1,length(b)); % 赋初值

tol=10^(-2); % 给定误差界

N=1000; % 给定最大迭代次数

[n,n]=size(A); % 确定矩阵A的阶

w=1; % 给定松弛因子

k=1;

% 迭代过程

while k<=N

x(1)=(b(1)-A(1,2:n)x0(2:n)')/A(1,1);

for i=2:n

x(i)=(1-w)x0(i)+w(b(i)-A(i,1:i-1)x(1:i-1)'-A(i,i+1:n)x0(i+1:n)')/A(i,i);

end

if max(abs(x-x0))<=tol

fid = fopen('SOR_iter_resulttxt', 'wt');

fprintf(fid,'\n用SOR迭代求解线性方程组的输出结果\n\n');

fprintf(fid,'迭代次数: %d次\n\n',k);

fprintf(fid,'x的值\n\n');

fprintf(fid, '%128f \n', x);

break;

end

k=k+1;

x0=x;

end

if k==N+1

fid = fopen('SOR_iter_resulttxt', 'wt');

fprintf(fid,'\n用SOR迭代求解线性方程组的输出结果\n\n');

fprintf(fid,'迭代次数: %d次\n\n',k);

fprintf(fid,'超过最大迭代次数,求解失败!');

fclose(fid);

end Matlab中龙格-库塔(Runge-Kutta)方法原理及实现龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法。由于此算法精度高,采取措施对误差进行抑制,所以其实现原理也较复杂。该算法是构建在数学支持的基础之上的。龙格库塔方法的理论基础来源于泰勒公式和使用斜率近似表达微分,它在积分区间多预计算出几个点的斜率,然后进行加权平均,用做下一点的依据,从而构造出了精度更高的数值积分计算方法。如果预先求两个点的斜率就是二阶龙格库塔法,如果预先取四个点就是四阶龙格库塔法。一阶常微分方程可以写作:y'=f(x,y),使用差分概念。

(Yn+1-Yn)/h= f(Xn,Yn)推出(近似等于,极限为Yn')

Yn+1=Yn+hf(Xn,Yn)

另外根据微分中值定理,存在0<t<1,使得

Yn+1=Yn+hf(Xn+th,Y(Xn+th))

这里K=f(Xn+th,Y(Xn+th))称为平均斜率,龙格库塔方法就是求得K的一种算法。

利用这样的原理,经过复杂的数学推导(过于繁琐省略),可以得出截断误差为O(h^5)的四阶龙格库塔公式:

K1=f(Xn,Yn);

K2=f(Xn+h/2,Yn+(h/2)K1);

K3=f(Xn+h/2,Yn+(h/2)K2);

K4=f(Xn+h,Yn+hK3);

Yn+1=Yn+h(K1+2K2+2K3+K4)(1/6);

所以,为了更好更准确地把握时间关系,应自己在理解龙格库塔原理的基础上,编写定步长的龙格库塔函数,经过学习其原理,已经完成了一维的龙格库塔函数。

仔细思考之后,发现其实如果是需要解多个微分方程组,可以想象成多个微分方程并行进行求解,时间,步长都是共同的,首先把预定的初始值给每个微分方程的第一步,然后每走一步,对多个微分方程共同求解。想通之后发现,整个过程其实很直观,只是不停的逼近计算罢了。编写的定步长的龙格库塔计算函数:

function [x,y]=runge_kutta1(ufunc,y0,h,a,b)%参数表顺序依次是微分方程组的函数名称,初始值向量,步长,时间起点,时间终点(参数形式参考了ode45函数)

n=floor((b-a)/h);%求步数

x(1)=a;%时间起点

y(:,1)=y0;%赋初值,可以是向量,但是要注意维数

for ii=1:n

x(ii+1)=x(ii)+h;

k1=ufunc(x(ii),y(:,ii));

k2=ufunc(x(ii)+h/2,y(:,ii)+hk1/2);

k3=ufunc(x(ii)+h/2,y(:,ii)+hk2/2);

k4=ufunc(x(ii)+h,y(:,ii)+hk3);

y(:,ii+1)=y(:,ii)+h(k1+2k2+2k3+k4)/6;

%按照龙格库塔方法进行数值求解

end

调用的子函数以及其调用语句:

function dy=test_fun(x,y)

dy = zeros(3,1);%初始化列向量

dy(1) = y(2) y(3);

dy(2) = -y(1) + y(3);

dy(3) = -051 y(1) y(2);

对该微分方程组用ode45和自编的龙格库塔函数进行比较,调用如下:

[T,F] = ode45(@test_fun,[0 15],[1 1 3]);

subplot(121)

plot(T,F)%Matlab自带的ode45函数效果

title('ode45函数效果')

[T1,F1]=runge_kutta1(@test_fun,[1 1 3],025,0,15);%测试时改变test_fun的函数维数,别忘记改变初始值的维数

subplot(122)

plot(T1,F1)%自编的龙格库塔函数效果

title('自编的 龙格库塔函数')

MATLAB 产品族可以用来进行以下各种工作:

● 数值分析

● 数值和符号计算

● 工程与科学绘图

● 控制系统的设计与仿真

● 数字图像处理 技术

● 数字信号处理 技术

● 通讯系统设计与仿真

● 财务与金融工程

MATLAB 的应用范围非常广,包括信号和图像处理、通讯、控制系统设计、测试和测量、财务建模和分析以及计算生物学等众多应用领域。附加的工具箱(单独提供的专用 MATLAB 函数集)扩展了 MATLAB 环境,以解决这些应用领域内特定类型的问题。

matlab特点

●此高级语言可用于技术计算

●此开发环境可对代码、文件和数据进行管理

●交互式工具可以按迭代的方式探查、设计及求解问题

●数学函数可用于线性代数、统计、傅立叶分析、筛选、优化以及数值积分等

●二维和三维图形函数可用于可视化数据

●各种工具可用于构建自定义的图形用户界面

●各种函数可将基于MATLAB的算法与外部应用程序和语言(如 C、C++、Fortran、Java、COM 以及 Microsoft Excel)集成

MATLAB的优势

(1)友好的工作平台和编程环境

MATLAB由一系列工具组成。这些工具方便用户使用MATLAB的函数和文件,其中许多工具采用的是图形用户界面。包括MATLAB桌面和命令窗口、历史命令窗口、编辑器和调试器、路径搜索和用于用户浏览帮助、工作空间、文件的浏览器。随着MATLAB的商业化以及软件本身的不断升级,MATLAB的用户界面也越来越精致,更加接近Windows的标准界面,人机交互性更强, *** 作更简单。而且新版本的MATLAB提供了完整的联机查询、帮助系统,极大的方便了用户的使用。简单的编程环境提供了比较完备的调试系统,程序不必经过编译就可以直接运行,而且能够及时地报告出现的错误及进行出错原因分析。

(2)简单易用的程序语言

Matlab一个高级的矩阵/阵列语言,它包含控制语句、函数、数据结构、输入和输出和面向对象编程特点。用户可以在命令窗口中将输入语句与执行命令同步,也可以先编写好一个较大的复杂的应用程序(M文件)后再一起运行。新版本的MATLAB语言是基于最为流行的C++语言基础上的,因此语法特征与C++语言极为相似,而且更加简单,更加符合科技人员对数学表达式的书写格式。使之更利于非计算机专业的科技人员使用。而且这种语言可移植性好、可拓展性极强,这也是MATLAB能够深入到科学研究及工程计算各个领域的重要原因。

(3)强大的科学计算机数据处理能力

MATLAB是一个包含大量计算算法的集合。其拥有600多个工程中要用到的数学运算函数,可以方便的实现用户所需的各种计算功能。函数中所使用的算法都是科研和工程计算中的最新研究成果,而前经过了各种优化和容错处理。在通常情况下,可以用它来代替底层编程语言,如C和C++ 。在计算要求相同的情况下,使用MATLAB的编程工作量会大大减少。MATLAB的这些函数集包括从最简单最基本的函数到诸如矩阵,特征向量、快速傅立叶变换的复杂函数。函数所能解决的问题其大致包括矩阵运算和线性方程组的求解、微分方程及偏微分方程的组的求解、符号运算、傅立叶变换和数据的统计分析、工程中的优化问题、稀疏矩阵运算、复数的各种运算、三角函数和其他初等数学运算、多维数组 *** 作以及建模动态仿真等。

(4)出色的图形处理功能

图形处理功能 MATLAB自产生之日起就具有方便的数据可视化功能,以将向量和矩阵用图形表现出来,并且可以对图形进行标注和打印。高层次的作图包括二维和三维的可视化、图象处理、动画和表达式作图。可用于科学计算和工程绘图。新版本的MATLAB对整个图形处理功能作了很大的改进和完善,使它不仅在一般数据可视化软件都具有的功能(例如二维曲线和三维曲面的绘制和处理等)方面更加完善,而且对于一些其他软件所没有的功能(例如图形的光照处理、色度处理以及四维数据的表现等),MATLAB同样表现了出色的处理能力。同时对一些特殊的可视化要求,例如图形对话等,MATLAB也有相应的功能函数,保证了用户不同层次的要求。另外新版本的MATLAB还着重在图形用户界面(GUI)的制作上作了很大的改善,对这方面有特殊要求的用户也可以得到满足。

(5)应用广泛的模块集合工具箱

MATLAB对许多专门的领域都开发了功能强大的模块集和工具箱。一般来说,它们都是由特定领域的专家开发的,用户可以直接使用工具箱学习、应用和评估不同的方法而不需要自己编写代码。目前,MATLAB已经把工具箱延伸到了科学研究和工程应用的诸多领域,诸如数据采集、数据库接口、概率统计、样条拟合、优化算法、偏微分方程求解、神经网络、小波分析、信号处理、图像处理、系统辨识、控制系统设计、LMI控制、鲁棒控制、模型预测、模糊逻辑、金融分析、地图工具、非线性控制设计、实时快速原型及半物理仿真、嵌入式系统开发、定点仿真、DSP与通讯、电力系统仿真等,都在工具箱(Toolbox)家族中有了自己的一席之地。

(6)实用的程序接口和发布平台

新版本的MATLAB可以利用MATLAB编译器和C/C++数学库和图形库,将自己的MATLAB程序自动转换为独立于MATLAB运行的C和C++代码。允许用户编写可以和MATLAB进行交互的C或C++语言程序。另外,MATLAB网页服务程序还容许在Web应用中使用自己的MATLAB数学和图形程序。MATLAB的一个重要特色就是具有一套程序扩展系统和一组称之为工具箱的特殊应用子程序。工具箱是MATLAB函数的子程序库,每一个工具箱都是为某一类学科专业和应用而定制的,主要包括信号处理、控制系统、神经网络、模糊逻辑、小波分析和系统仿真等方面的应用。

(7)应用软件开发(包括用户界面)

在开发环境中,使用户更方便地控制多个文件和图形窗口;在编程方面支持了函数嵌套,有条件中断等;在图形化方面,有了更强大的图形标注和处理功能,包括对性对起连接注释等;在输入输出方面,可以直接向Excel和HDF5进行连接。

在这里:

function u = EVOLUTION(u0, g, lambda, mu, alf, epsilon, delt, numIter)

% EVOLUTION(u0, g, lambda, mu, alf, epsilon, delt, numIter) updates the level set function

% according to the level set evolution equation in Chunming Li et al's paper:

% "Level Set Evolution Without Reinitialization: A New Variational Formulation"

% in Proceedings CVPR'2005,

% Usage:

% u0: level set function to be updated

% g: edge indicator function

% lambda: coefficient of the weighted length term L(\phi)

% mu: coefficient of the internal (penalizing) energy term P(\phi)

% alf: coefficient of the weighted area term A(\phi), choose smaller alf

% epsilon: the papramater in the definition of smooth Dirac function, default value 15

% delt: time step of iteration, see the paper for the selection of time step and mu

% numIter: number of iterations

%

u=u0;

[vx,vy]=gradient(g);

for k=1:numIter

u=NeumannBoundCond(u);

[ux,uy]=gradient(u);

normDu=sqrt(ux^2 + uy^2 + 1e-10);

Nx=ux/normDu;

Ny=uy/normDu;

diracU=Dirac(u,epsilon);

K=curvature_central(Nx,Ny);

weightedLengthTerm=lambdadiracU(vxNx + vyNy + gK);

penalizingTerm=mu(4del2(u)-K);

weightedAreaTerm=alfdiracUg;

u=u+delt(weightedLengthTerm + weightedAreaTerm + penalizingTerm); % update the level set function

end

% the following functions are called by the main function EVOLUTION

function f = Dirac(x, sigma) %水平集狄拉克计算

f=(1/2/sigma)(1+cos(pix/sigma));

b = (x<=sigma) & (x>=-sigma);

f = fb;

function K = curvature_central(nx,ny); %曲率中心

[nxx,junk]=gradient(nx);

[junk,nyy]=gradient(ny);

K=nxx+nyy;

function g = NeumannBoundCond(f)

% Make a function satisfy Neumann boundary condition

[nrow,ncol] = size(f);

g = f;

g([1 nrow],[1 ncol]) = g([3 nrow-2],[3 ncol-2]);

g([1 nrow],2:end-1) = g([3 nrow-2],2:end-1);

g(2:end-1,[1 ncol]) = g(2:end-1,[3 ncol-2]);

以上就是关于求程序 在matlab上用Dijkstra和Floyd算法求出v1到v8的最短路径。。全部的内容,包括:求程序 在matlab上用Dijkstra和Floyd算法求出v1到v8的最短路径。。、matlab怎么编写把一个算法独立运行20次并输出图、matlab的算法有哪些急用!谢谢啊!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9673555.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存