当前位置: 首页 > news >正文

matlab编程实践14、15

目录

数独

"四独"游戏

解的存在和唯一性

算法

常微分方程 


数独


        采用蛮力试凑法来解决数独问题。(采用单选数,以及计算机科学技术中的递推回溯法

        以上的数独是图14-2的两个矩阵的和,左侧的矩阵可以由kron和magic函数建立起来,前一个函数用来求Kronecker乘积,后者生成幻方矩阵。

X = kron(eye(3), magic(3))


"四独"游戏


        使用4×4网格,可能的备选项用小数标注出来。将单选数填在网格内,如果没有单选数,则采用递归回溯法来求解。(左:有单选数; 右:无单选数)

 

X=diag(1:4)
Y=shidoku(diag(1:4))
Z=shidoku(diag(1:4)')'  %可能的另一个解

解的存在和唯一性


        可以用sudoku_all程序来寻找数独全部的解。

%生成数独谜题
X=kron(eye(3), magic(3))
X=sudoku_puzzle(13)

        数独网格的一些运算可能改变其在图形用户界面中的显示,但不能改变其基本特性。所有变化基本上都是相同的数字谜。这些等效的运算可以用matlab的数组运算表示。

%重新排列表示数字的文字
p = randperm(9), z=find(X>0). X(z)=p(X(z))
%其它运算
X', rot90(X, k)
flipud(X), fliplr(X),X([4:9 1:3], :)
X(:, randperm(3) 4:9)
function L = sudoku_all(X,L)
% SUDOKU_ALL  Enumerate all solutions to a Sudoku puzzle.
%   L = sudoku_all(X), for a 9-by-9 array X, is a list of all solutions.
%   L{k} is the k-th solution.
%   L{:} will print all the solutions.
%   length(L) is the number of solutions.  A valid puzzle must have only one.
%   See also sudoku, sudoku_basic, sudoku_puzzle, sudoku_assist.if nargin < 2% Initialize the list on first entry.L = {};end% Fill in all "singletons", the cells with only one candidate.% C is the array of candidates for each cell.% N is the vector of the number of candidates for each cell.% s is the index of the first cell with the fewest candidates.[C,N] = candidates(X);while all(N>0) & any(N==1)s = find(N==1,1);X(s) = C{s};[C,N] = candidates(X);end% Add a solution to the list.if all(X(:)>0)L{end+1} = X;end% Enumerate all possible solutions.if all(N>0)Y = X;s = find(N==min(N),1);for t = [C{s}]                    % Iterate over the candidates.X = Y;X(s) = t;                      % Insert a value.L = sudoku_all(X,L);           % Recursive call.endend% ------------------------------function [C,N] = candidates(X)% C = candidates(X) is a 9-by-9 cell array of vectors.% C{i,j} is the vector of allowable values for X(i,j).% N is a row vector of the number of candidates for each cell.% N(k) = Inf for cells that already have values.tri = @(k) 3*ceil(k/3-1) + (1:3);C = cell(9,9);for j = 1:9for i = 1:9if X(i,j)==0z = 1:9;z(nonzeros(X(i,:))) = 0;z(nonzeros(X(:,j))) = 0;z(nonzeros(X(tri(i),tri(j)))) = 0;C{i,j} = nonzeros(z)';endendendN = cellfun(@length,C);N(X>0) = Inf;N = N(:)';end % candidates
end % sudoku_all

算法


基本流程:

① 填入所有的单选数

②如果某个单元没有备选项,停止程序

③在某个空白的网格中填入一个试探的值

④ 递归式调用此程序

 

function [X,steps] = sudoku(X,steps)
% SUDOKU  Solve a Sudoku puzzle using recursive backtracking.
%   sudoku(X), for a 9-by-9 array X, solves the Sudoku puzzle for X.
%   [X,steps] = sudoku(X) also returns the number of steps.
%   See also sudoku_all, sudoku_assist, sudoku_basic, sudoku_puzzle. if nargin < 1X = sudoku_puzzle(1);endif nargin < 2steps = 0;gui_init(X);endsudoku_gui(X,steps);% Fill in all "singletons", the cells with only one candidate.% C is the array of candidates for each cell.% N is the vector of the number of candidates for each cell.% s is the index of the first cell with the fewest candidates.[C,N] = candidates(X);while all(N>0) & any(N==1)sudoku_gui(X,steps,C);s = find(N==1,1);X(s) = C{s};steps = steps + 1;sudoku_gui(X,steps,C);[C,N] = candidates(X);endsudoku_gui(X,steps,C);% Recursive backtracking.if all(N>0)Y = X;s = find(N==min(N),1);for t = [C{s}]                        % Iterate over the candidates.X = Y;sudoku_gui(X,steps,C);X(s) = t;                          % Insert a tentative value.steps = steps + 1;sudoku_gui(X,steps,C,s);           % Color the tentative value.[X,steps] = sudoku(X,steps);       % Recursive call.if all(X(:) > 0)                   % Found a solution.breakendsudoku_gui(X,steps,C,-s);          % Revert color of tentative value.endendif nargin < 2gui_finish(X,steps);end% ------------------------------function [C,N] = candidates(X)% C = candidates(X) is a 9-by-9 cell array of vectors% C{i,j} is the vector of allowable values for X(i,j).% N is a row vector of the number of candidates for each cell.% N(k) = Inf for cells that already have values.tri = @(k) 3*ceil(k/3-1) + (1:3);C = cell(9,9);for j = 1:9for i = 1:9if X(i,j)==0z = 1:9;z(nonzeros(X(i,:))) = 0;z(nonzeros(X(:,j))) = 0;z(nonzeros(X(tri(i),tri(j)))) = 0;C{i,j} = nonzeros(z)';endendendN = cellfun(@length,C);N(X>0) = Inf;N = N(:)';end % candidates% ------------------------------function gui_init(X)% Initialize gui% H is the structure of handles, saved in figure userdata.dkblue = [0 0 2/3];dkgreen = [0 1/2 0];dkmagenta = [1/3 0 1/3];grey = [1/2 1/2 1/2];fsize = get(0,'defaulttextfontsize');fname = 'Lucida Sans Typewriter';clfshgset(gcf,'color','white')axis squareaxis offfor m = [2 3 5 6 8 9]line([m m]/11,[1 10]/11,'color',grey)line([1 10]/11,[m m]/11,'color',grey)endfor m = [1 4 7 10]line([m m]/11,[1 10]/11,'color',dkmagenta,'linewidth',4)line([1 10]/11,[m m]/11,'color',dkmagenta,'linewidth',4)endH.a = zeros(9,9);for j = 1:9for i = 1:9if X(i,j) > 0string = int2str(X(i,j));color = dkblue;elsestring = ' ';color = dkgreen;endH.a(i,j) = text((j+1/2)/11,(10.5-i)/11,string, ...'units','normal','fontsize',fsize+6,'fontweight','bold', ...'fontname',fname,'color',color,'horizont','center');endendstrings = {'step','slow','fast','finish'};H.b = zeros(1,4);for k = 1:4H.b(k) = uicontrol('style','toggle','string',strings{k}, ...'units','normal','position',[(k+3)*0.125,0.05,0.10,0.05], ...'background','white','value',0, ...'callback', ...'H=get(gcf,''user''); H.s=find(H.b==gco); set(gcf,''user'',H)');endset(H.b(1),'style','pushbutton')H.s = 1;H.t = title('0','fontweight','bold');set(gcf,'userdata',H)drawnowend % gui_init% ------------------------------function sudoku_gui(X,steps,C,z)H = get(gcf,'userdata');if H.s == 4if mod(steps,50) == 0set(H.t,'string',int2str(steps))drawnowendreturnelseset(H.t,'string',int2str(steps))endk = [1:H.s-1 H.s+1:4];set(H.b(k),'value',0);dkblue = [0 0 2/3];dkred = [2/3 0 0];dkgreen = [0 1/2 0];cyan = [0 2/3 2/3];fsize = get(0,'defaulttextfontsize');% Update entire array, except for initial entries.for j = 1:9for i = 1:9if ~isequal(get(H.a(i,j),'color'),dkblue) && ...~isequal(get(H.a(i,j),'color'),cyan)if X(i,j) > 0set(H.a(i,j),'string',int2str(X(i,j)),'fontsize',fsize+6, ...'color',dkgreen)elseif nargin < 3set(H.a(i,j),'string',' ')elseif length(C{i,j}) == 1set(H.a(i,j),'string',char3x3(C{i,j}),'fontsize',fsize-4, ...'color',dkred)elseset(H.a(i,j),'string',char3x3(C{i,j}),'fontsize',fsize-4, ...'color',dkgreen)endendendendif nargin == 4if z > 0set(H.a(z),'color',cyan)elseset(H.a(-z),'color',dkgreen)returnendend% Gui action = single step, brief pause, or no pauseswitch H.scase 1H.s = 0;set(gcf,'userdata',H);while H.s == 0;drawnowH = get(gcf,'userdata');endcase 2pause(0.5)case 3drawnowendif nargin == 4if z > 0set(H.a(z),'color',cyan)elseset(H.a(-z),'color',dkgreen)returnendend% ------------------------------function s = char3x3(c)% 3-by-3 character array of candidates.b = blanks(5);s = {b; b; b};for k = 1:length(c)d = c(k);p = ceil(d/3);q = 2*mod(d-1,3)+1;s{p}(q) = int2str(d);endendend % gui% ------------------------------function gui_finish(X,steps)H = get(gcf,'userdata');H.s = 2;set(H.b(1:3),'vis','off')set(gcf,'userdata',H)set(H.b(4),'string','close','value',0, ...'callback','close(gcf)')sudoku_gui(X,steps)end % gui_finishend % sudoku

        备选项计算&数独题目生成:

%% Candidates备选项计算% C = candidates(X) 为向量数组构成的单元结构
% C{i,j} 为 X(i,j)构成的集合C = cell(9,9);tri = @(k) 3*ceil(k/3-1) + (1:3);for j = 1:9for i = 1:9if X(i,j)==0z = 1:9;z(nonzeros(X(i,:))) = 0;z(nonzeros(X(:,j))) = 0;z(nonzeros(X(tri(i),tri(j)))) = 0;C{i,j} = nonzeros(z)';endendendC%% First singleton and first empty. 第一个单选数,第一个空白网格% N = number of candidates in each cell.
% s = first cell with only one candidate.
% e = first cell with no candidates.N = cellfun(@length,C)s = find(X==0 & N==1,1)e = find(X==0 & N==0,1)%% Sudoku puzzles 数独题目生成help sudoku_puzzlefor p = 1:16sudoku_puzzle(p)end

常微分方程 


        matlab提供了很多求给定常微分方程数组近似解的函数,这一常微分方程组数值解的函数包括ode23、ode45、ode113、ode23s、ode15s、ode23t、ode23tb函数名中的数字表示所用算法的阶次,阶次和算法的复杂程度和精度有关。所有这些函数都会自动选择近似步长,来保证预先选择的精度要求。所选择的阶次越高,每一步计算量越大,但是所用的步长也越大。比如ode23算法比较二阶和三阶算法来估计计算步长,而ode45比较的是四阶和五阶算法。

        s表示为stiff 刚性微分方程的求解函数。

        微分方程求解程序库提供的求解函数都至少需要下面三个输入变元:

(1)F为定义微分方程组的函数

(2)tspan为描述积分区间的向量

(3) y0为初始值的向量

ode1的算法-误差较大

function [t,y] = ode1(F,tspan,y0)
% ODE1  World's simplest ODE solver.
%   ODE1(F,[t0,tfinal],y0) uses Euler's method to solve
%      dy/dt = F(t,y)
%   with y(t0) = y0 on the interval t0 <= t <= tfinal.t0 = tspan(1);
tfinal = tspan(end);
h = (tfinal - t0)/200;
y = y0;
for t = t0:h:tfinalydot = F(t,y);y = y + h*ydot;
end

匿名函数生成微分方程:

    acircle = @(t,y) [y(2); -y(1)];

ode23求解

%% ODE23 Automatic Plotting.figuretspan = [0 2*pi];y0 = [0; 1];ode23(acircle,tspan,y0)%% Phase Plot.figuretspan = [0 2*pi];y0 = [0; 1];[t,y] = ode23(acircle,tspan,y0)plot(y(:,1),y(:,2),'-o')axis squareaxis([-1.1 1.1 -1.1 1.1])%% ODE23 Automatic Phase Plot.opts = odeset('outputfcn',@odephas2)ode23(acircle,tspan,y0,opts)axis squareaxis([-1.1 1.1 -1.1 1.1])

odeset

相关文章:

matlab编程实践14、15

目录 数独 "四独"游戏 解的存在和唯一性 算法 常微分方程 数独 采用蛮力试凑法来解决数独问题。&#xff08;采用单选数&#xff0c;以及计算机科学技术中的递推回溯法&#xff09; 以上的数独是图14-2的两个矩阵的和&#xff0c;左侧的矩阵可以由kron和magic函…...

C++ ——STL容器【list】模拟实现

代码仓库&#xff1a; list模拟实现 list源码 数据结构——双向链表 文章目录 &#x1f347;1. 节点结构体&#x1f348;2. list成员&#x1f349;3. 迭代器模板&#x1f34a;4. 迭代器&#x1f34b;5. 插入删除操作&#x1f34c;5.1 insert & erase&#x1f34c;5.2 push_…...

ubuntu 16.04 安装mujoco mujoco_py gym stable_baselines版本问题

ubuntu 16.04系统 Python 3.7.16 mujoco200 (py37mujoco) abc123:~/github/spinningup$ pip list Package Version Editable project location ----------------------------- --------- --------------------------- absl-py …...

自然语言处理(NLP)技术

自然语言处理技术是一种人工智能技术&#xff0c;它的目标是使计算机能够理解、分析、处理和生成自然语言&#xff08;人类使用的语言&#xff09;。NLP技术包括文本分类、情感分析、机器翻译、语音识别、语音合成、信息检索、信息抽取、问答系统等。NLP技术的应用非常广泛&…...

如何将ubuntu LTS升级为Pro

LTS支持周期是5年&#xff1b; Pro支持周期是10年。 Ubuntu Pro专业版笔记 步骤&#xff1a; 打开“软件和更新” 可以看到最右侧的标签是Ubuntu Pro。 在没有升级之前&#xff0c;如果使用下面两步&#xff1a; sudo apt updatesudo apt upgrade 出现如下提示&#xff…...

如何学习ARM嵌入式开发?

ARM和单片机还是有许多区别的&#xff0c;可以说比单片机的应用更为复杂吧&#xff0c;往往在单片机里只需要对一个寄存器赋值就可以的初始化&#xff0c;在ARM下就要调用库函数了。甚至每个引脚其功能都多了许多&#xff0c;相应的配置也会更为麻烦&#xff0c;但如果做多了AR…...

二、使用运行自己的docker python容器环境

第一篇参考&#xff1a; https://blog.csdn.net/weixin_42357472/article/details/131953866 运行容器同时执行命令或脚本 1&#xff09;这是打开一个对外的jupyter notebook容器环境 docker run -d --name my_container -p 8090:8888 mynewpythonimage jupyter notebook --…...

mac版窗口管理 Magnet for mac中文最新

magnet mac版是一款运行在苹果电脑上的一款优秀的窗口大小控制工具&#xff0c;拖拽窗口到屏幕边缘可以自动半屏&#xff0c;全屏或者四分之一屏幕&#xff0c;还可以设定快捷键完成分屏。这款专业的窗口管理工具当您每次将内容从一个应用移动到另一应用时&#xff0c;当您需要…...

Redis(五)—— Redis进阶部分

一、Redis配置文件详解 注意这是Redis服务本身的配置文件&#xff0c;相当于maven的settings.xml&#xff0c;而不是我们在springboot去配置Redis的那个application.yml。 核心部分include 引入其他redis配置文件&#xff0c;相当于spring的<import>bind 设置IP&#xf…...

Go Ethereum源码学习笔记000

Go Ethereum源码学习笔记 前言时代的弄潮儿: Blockchain为什么要研究以太坊& Go-Ethereum 的原理 前言 这个专栏的内容是免费的&#xff0c;因为自己这边都是基于开源库和开源内容整理的学习笔记&#xff0c;在这个过程中进行增删改查&#xff0c;将自己的理解融入其中&am…...

layui 设置选中时间为当天时间最大值23:59:59、laydate设置选中时间为当天时间最大值23:59:59

既是涨知识的一天&#xff0c;又是干前端的一天&#xff01; laydate.render({ elem: #validityPeriod, //type: datetime,//类型要一定要相匹配 type: date, // 设置日期选择模式 trigger: click, format: yyyy-MM-dd HH:mm:ss, // 设置日期的显示格式 min: startDate, max: …...

HTML+CSS+JavaScript:验证码60秒倒计时按钮

一、需求 1、打开浏览器时&#xff0c;按钮禁用&#xff0c;按钮内容为60秒倒计时 2、倒计时结束时&#xff0c;按钮禁用被取消 二、应用场景 1、60秒内不得重新发送验证码 2、我已阅读用户协议&#xff08;5s&#xff09; 三、完整代码 <!DOCTYPE html> <html l…...

互联网医院系统开发:打造便捷高效的医疗服务平台

随着互联网技术的飞速发展&#xff0c;互联网医院系统的出现为医疗行业带来了许多新的机遇和优势。互联网医院系统是一种基于互联网技术的医疗服务平台&#xff0c;旨在提供便捷、高效、个性化的医疗服务。下面将介绍互联网医院系统开发的优势。   提供便捷的医疗服务&#x…...

章节5:SQL注入之WAF绕过

章节5&#xff1a;SQL注入之WAF绕过 5.1 SQL注入之WAF绕过上 WAF拦截原理&#xff1a;WAF从规则库中匹配敏感字符进行拦截。 5.2 SQL注入之WAF绕过下 &#xff08;原理简单了解&#xff09; 关键词大小写绕过 有的WAF因为规则设计的问题&#xff0c;只匹配纯大写或纯小写的…...

iphone卡在恢复模式怎么办?修复办法分享!

iPhone 卡在恢复屏幕问题是 iPhone 用户在软件更新或恢复期间的常见问题。如果你也遇到此问题&#xff0c;不要着急&#xff0c;接下来我们将探讨 iPhone 卡在恢复屏幕上的主要原因&#xff0c;以及如何轻松修复它。 iPhone卡在恢复屏幕问题上没有一个特别的原因&#xff0c;但…...

uniApp禁止遮罩弹窗下的页面滚动

文章目录 问题解决代码 问题 最近用uniApp开发一款软件&#xff0c;页面是可以滚动的长列表&#xff0c;自定义组件弹窗遮罩出来后&#xff0c;滑动屏幕&#xff0c;页面也跟着滚动。研究了网上的解决办法 在遮罩层的最外层的view元素中加入 touchmove.stop.prevent"moveH…...

【Huawei】WLAN实验(三层发现)

拓扑图如上&#xff0c;AP与S1在同一VLAN,S1与AC在同一VLAN&#xff0c;AP采用三层发现AC&#xff0c;AP与客户的DHCP由S1提供。 S1配置 vlan batch 10 20 30 dhcp enable ip pool apgateway-list 192.168.20.1network 192.168.20.0 mask 255.255.255.0option 43 sub-option …...

Windows 10 安装 PostgreSQL 12.x 报错 ‘psql‘ 不是内部或外部命令 由于找不到文件libintl-9.dll等问题

目录 序言一、问题总结问题 1 psql 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。问题 2 “由于找不到文件libintl-9.dll&#xff0c;无法继续执行代码&#xff0c;重新安装程序可能会解决此问题。“1、卸载2、安装3、安装 Stack Builder &#xff08;这个可…...

在CSDN学Golang云原生(持续交付Argo)

一&#xff0c;Argo安装配置 Argo是一个基于Kubernetes的容器本地工作流引擎&#xff0c;可以帮助用户在Kubernetes上创建、运行和维护容器化应用程序。下面是Argo安装配置的步骤&#xff1a; 首先确保你已经安装了kubectl和helm添加chart仓库 $ helm repo add argo https:/…...

安全运维 -- splunk 集群配置归档

0x00 背景 splunk 集群索引服务器容量满了以后&#xff0c;为了防止数据丢失&#xff0c;需要对旧数据进行归档保存。 0x01 原理 指定一台大容量服务器&#xff0c;创建共享文件夹&#xff0c;并将集群里的所有indexer指向这个归档共享目录。 0x02 实施 集群的每个indexer都…...

Umi-OCR:完全免费开源的离线OCR神器,3分钟快速上手文字识别

Umi-OCR&#xff1a;完全免费开源的离线OCR神器&#xff0c;3分钟快速上手文字识别 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片&#xff0c;PDF文档识别&#xff0c;排除水印/页眉页脚&#xff0c;扫描/生成二维…...

百度网盘直链解析工具:3分钟突破限速实现满速下载

百度网盘直链解析工具&#xff1a;3分钟突破限速实现满速下载 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾为百度网盘的下载速度而烦恼&#xff1f;非会员用户经常…...

Wand-Enhancer:零成本解锁WeMod高级功能的完整指南

Wand-Enhancer&#xff1a;零成本解锁WeMod高级功能的完整指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod专业版的订阅费用而犹豫不决吗…...

Unity游戏开发集成MCP协议:AI助手自动化操作指南

1. 项目概述&#xff1a;Unity游戏开发中的MCP革命如果你是一名Unity开发者&#xff0c;最近可能已经注意到一个名为“CoderGamester/mcp-unity”的项目在GitHub上悄然走红。这不仅仅是一个普通的插件或工具包&#xff0c;它代表了一种全新的工作流范式&#xff0c;旨在将大型语…...

Windows驱动清理终极指南:用DriverStore Explorer安全释放数十GB磁盘空间

Windows驱动清理终极指南&#xff1a;用DriverStore Explorer安全释放数十GB磁盘空间 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你的Windows电脑是否经常提示C盘空间不足&#xff…...

Claude API企业准入最后窗口期:2024Q3起强制启用OAuth 2.1+硬件级密钥绑定,现在不升级将无法续签

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Claude API企业准入政策的演进与合规紧迫性 随着Anthropic对Claude模型商用边界的持续收束&#xff0c;企业级API接入正从“技术可用性”转向“治理可验证性”。2024年Q2起&#xff0c;所有新注册企业账…...

openpilot自动驾驶系统深度解析:架构剖析与实战指南

openpilot自动驾驶系统深度解析&#xff1a;架构剖析与实战指南 【免费下载链接】openpilot openpilot is an operating system for robotics. Currently, it upgrades the driver assistance system on 300 supported cars. 项目地址: https://gitcode.com/GitHub_Trending/…...

PowerInfer:基于热点神经元预测的LLM高性能推理引擎部署指南

1. 项目概述&#xff1a;当推理速度成为AI落地的瓶颈最近在折腾本地大模型推理的朋友&#xff0c;估计都绕不开一个核心痛点&#xff1a;速度。模型效果再好&#xff0c;生成一句话要等上十几秒&#xff0c;那种“卡顿感”足以劝退绝大多数想把它集成到实际应用里的开发者。我自…...

基于BLE HID与旋转编码器打造双模式无线遥控器

1. 项目概述你有没有过这样的时刻&#xff1a;窝在沙发里看剧&#xff0c;想调个音量或者暂停一下&#xff0c;却不得不伸手去够茶几上的键盘或鼠标&#xff0c;打断那份沉浸的惬意&#xff1f;或者&#xff0c;在电脑上回味一些经典老游戏时&#xff0c;觉得用键盘移动、鼠标射…...

用C++和RealSense D435i搞个3D手势识别?从像素坐标到相机坐标的保姆级避坑指南

3D手势识别实战&#xff1a;用RealSense D435i实现像素到相机坐标的高精度转换 当你的手指在空气中划出一道弧线&#xff0c;计算机能否精准捕捉这个三维动作&#xff1f;这正是3D手势识别技术试图解决的问题。作为人机交互领域的前沿方向&#xff0c;3D手势识别正在VR游戏、医…...