跪求!!SLM衍射特性研究及衍射光学元件设计实验的思路以及思想。。 另外,跪求GS算法的介绍!!

跪求!!SLM衍射特性研究及衍射光学元件设计实验的思路以及思想。。 另外,跪求GS算法的介绍!!,第1张

SLM研究DOE很简单的一个做法就是将液晶屏视为可编程的蚀刻板,通过matlab计算各种灰度图,比如模拟退火算法\模拟轴椎透镜等, 通过不同的灰度图改变SLM液晶分子扭角获得不同衍射效果, 利用CCD对出射光斑进行能量分析, 类似高斯光变为平顶光的效果,DOE能实现,SLM也同样能实现,类似的实验在瑞光空间光调制器的网站中有介绍

function ret=Code(lenchrom,bound)

%本函数变量编码成染色体,用于随机初始化一个种群

% lenchrom input : 染色体长度

% bound input : 变量的取值范围

% ret output: 染色体的编码值

flag=0;

while flag==0

pick=rand(1,length(lenchrom));

ret=bound(:,1)'+(bound(:,2)-bound(:,1))'pick; %线性插值

flag=test(lenchrom,bound,ret); %检验染色体的可行性

end

function ret=Cross(pcross,lenchrom,chrom,sizepop,bound)

%本函数完成交叉 *** 作

% pcorss input : 交叉概率

% lenchrom input : 染色体的长度

% chrom input : 染色体群

% sizepop input : 种群规模

% ret output : 交叉后的染色体

for i=1:sizepop

% 随机选择两个染色体进行交叉

pick=rand(1,2);

while prod(pick)==0

pick=rand(1,2);

end

index=ceil(picksizepop);

% 交叉概率决定是否进行交叉

pick=rand;

while pick==0

pick=rand;

end

if pick>pcross

continue;

end

flag=0;

while flag==0

% 随机选择交叉位置

pick=rand;

while pick==0

pick=rand;

end

pos=ceil(picksum(lenchrom)); %随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同

pick=rand; %交叉开始

v1=chrom(index(1),pos);

v2=chrom(index(2),pos);

chrom(index(1),pos)=pickv2+(1-pick)v1;

chrom(index(2),pos)=pickv1+(1-pick)v2; %交叉结束

flag1=test(lenchrom,bound,chrom(index(1),:)); %检验染色体1的可行性

flag2=test(lenchrom,bound,chrom(index(2),:)); %检验染色体2的可行性

if flag1flag2==0

flag=0;

else flag=1;

end %如果两个染色体不是都可行,则重新交叉

end

end

ret=chrom;

clc

clear all

% warning off

%% 遗传算法参数

maxgen=50; %进化代数

sizepop=100; %种群规模

pcross=[06]; %交叉概率

pmutation=[01]; %变异概率

lenchrom=[1 1]; %变量字串长度

bound=[-5 5;-5 5]; %变量范围

%% 个体初始化

individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]); %种群结构体

avgfitness=[]; %种群平均适应度

bestfitness=[]; %种群最佳适应度

bestchrom=[]; %适应度最好染色体

% 初始化种群

for i=1:sizepop

individualschrom(i,:)=Code(lenchrom,bound); %随机产生个体

x=individualschrom(i,:);

individualsfitness(i)= (x(1)exp(-(x(1)^2 + x(2)^2)));

%-20exp(-02sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2pix(1))+cos(2pix(2)))/2)+20+271289

% 这个是我的测试函数

% 如果有这个函数的话,可以得到最优值

end

%找最好的染色体

[bestfitness bestindex]=min(individualsfitness);

bestchrom=individualschrom(bestindex,:); %最好的染色体

avgfitness=sum(individualsfitness)/sizepop; %染色体的平均适应度

% 记录每一代进化中最好的适应度和平均适应度

trace=[];

%% 进化开始

for i=1:maxgen

% 选择 *** 作

individuals=Select(individuals,sizepop);

avgfitness=sum(individualsfitness)/sizepop;

% 交叉 *** 作

individualschrom=Cross(pcross,lenchrom,individualschrom,sizepop,bound);

% 变异 *** 作

individualschrom=Mutation(pmutation,lenchrom,individualschrom,sizepop,[i maxgen],bound);

% 计算适应度

for j=1:sizepop

x=individualschrom(j,:);

individualsfitness(j)=(x(1)exp(-(x(1)^2 + x(2)^2)));

%-20exp(-02sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2pix(1))+cos(2pix(2)))/2)+20+271289

% -20exp(-02sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2pix(1))+cos(2pix(2)))/2)+20+271289;

end

%找到最小和最大适应度的染色体及它们在种群中的位置

[newbestfitness,newbestindex]=min(individualsfitness);

[worestfitness,worestindex]=max(individualsfitness);

% 代替上一次进化中最好的染色体

if bestfitness>newbestfitness

bestfitness=newbestfitness;

bestchrom=individualschrom(newbestindex,:);

end

individualschrom(worestindex,:)=bestchrom;

individualsfitness(worestindex)=bestfitness;

avgfitness=sum(individualsfitness)/sizepop;

trace=[trace;avgfitness bestfitness]; %记录每一代进化中最好的适应度和平均适应度

end

%进化结束

%% 结果显示

[r c]=size(trace);

figure

plot([1:r]',trace(:,1),'r-',[1:r]',trace(:,2),'b--');

title(['函数值曲线 ' '终止代数=' num2str(maxgen)],'fontsize',12);

xlabel('进化代数','fontsize',12);ylabel('函数值','fontsize',12);

legend('各代平均值','各代最佳值','fontsize',12);

ylim([-05 5])

disp('函数值 变量');

% 窗口显示

disp([bestfitness x]);

function tonglun

syms x1 x2 x3 x4

F=[-cos(x1)+cos(x2)-cos(x3)+cos(x4)-06

    -cos(5x1)+cos(5x2)-cos(5x3)+cos(5x4)

    -cos(7x1)+cos(7x2)-cos(7x3)+cos(7x4)

    -cos(11x1)+cos(11x2)-cos(11x3)+cos(11x4)];

var = sym(symvar(findsym(F)));%var is string 要变换下

dF = jacobian(F,var);

x0=[039 065 091 118]';

Fx = subs(F,findsym(F),x0)

N=1400;

h=1/N;

b=-hFx;

for i=1:N

A=subs(dF,var,x0);

k1=inv(A)b;

A=subs(dF,var,x0+05k1);

k2=inv(A)b;

A=subs(dF,var,x0+05k2);

k3=inv(A)b;

A=subs(dF,var,x0+05k3);

k4=inv(A)b;

x0=x0+(k1+2k2+2k3+k4)/6;

end

x=x0;

disp('The Solution is:')

disp('x=');disp(x);

subs(F,findsym(F),x)

=======================

The Solution is:

x=

   -59548

   -58381

   -16512

   -09719

ans =

  10e-003 

    00040

   -01540

   -01043

    05477

在这里:

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函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。你已经知道Matlab提供了许多内建函数,比如disp()。但你也可以自己创建函数,这被叫做用户自定义函数

>>disp('hello world')hello world

总的来说,自定义函数分为两步:即定义函数和调用函数。

定义一个函数

你可以定义一个由自己想要功能的函数,以下是简单的规则:

函数代码块以function关键词开头,后接输出变量和函数标识符名称和圆括号()。

任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。

函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。

函数内容以end结束。

函数需要定义在脚本文件(m)中运行,不可以在命令窗口中临时创建。

语法

Matlab定义函数需要使用function关键字,一般格式如下:

function输出变量=函数名(输入变量) 函数体end

这里的输入变量和输出变量都可以根据实际情况缺省。

实例

创建一个函数,用来输出“hello world!” ,步骤如下:

新建一个脚本,命名为eg1m

test();functiontest()disp('hello world!')end

点击顶部菜单的运行按钮,即可在命令窗口输出:

>>eg1 hello world!

更复杂一点的应用,我们让函数带上输入变量和输出变量:

s=calc_area(4,5);functions=calc_area(w,h)s=wh;disp(['area=',num2str(s)]);end

以上实例输出:

>>eg2 area=20

输入变量缺省

有时候,输入变量的个数不确定,但是又想将不同个数情况统一到一个函数里,即输入变量有缺省时,可以利用nargin来判断,然后给出对应的输出。例如:

out(1)out(1,2)out(1,2,3)functionout(a,b,c)ifnargin==1disp(a)elseifnargin==2disp([a,b])elseifnargin==3disp([a,b,c])endend

上面的实例将会得到:

>>eg5112123

可以看到,当输入不同输入变量个数时,会找到对应个数下的执行代码,返回相应的内容。

当然这种做法也存在弊端,当变量个数太多时,要写很多个判断;这种情况下可以尝试inputParser,这里我就不多解释了,有兴趣可以看这篇博文了解下。

函数调用

函数基本结构完成后,进行调用时,存在两种方法:

直接在函数所在脚本文件内调用(上面的例子就是这种情况);

函数定义与调用分开,各自存为一个脚本,运行调用脚本。

法一:脚本内调用函数

如上图所示,调用函数在前,定义函数在后,点运行即可得到输出。

法二:函数脚本独立,另外写代码调用

如上图所示,函数脚本和调用函数的脚本分开了,保存在同一路径下。

在第二种方法下,也可以在命令窗口直接调用所写的函数:

这种调用与上面本质上是一样的,都是首先找到以函数名命名的脚本文件,然后再执行函数内部代码块,返回结果。在这里必须注意函数脚本名字要与函数名一致。

事实上,为了让编程变得系统化,模块化,我们不建议你采用第一种方法去写代码,因为这样不利于分析和维护代码。

而采用后面一种方法时,我们可以定义很多个函数,然后在其他脚本里调用它们,这样形成了一种模块化的关系。我们在分析代码时,注意力可以集中到主程序上,思路将更加清晰。

输出值缺省调用

在matlab的函数中,可以选择性地获取所返回的变量列表值,下面给出实例:

default=out()[a,~,~]=out()[~,b,~]=out()[~,~,c]=out()function[a,b,c]=out()a=1;b=2;c=3;end

上述实例输出结果:

>>eg4 default=1a=1b=2c=3

可以看到,函数默认以返回的第一个变量为输出值;若想得到返回的某个值时,用变量接住,对于不需要的值,则需要用~占位,但不接收这个值,这样做的目的就是为了保证输出的序号能够匹配到。

函数就是定义和调用,针对实际问题,分析出输入、输出变量,理清楚中间环节以什么样的流程一步步转换,这样就可以顺利完成自定义函数的编写。

可以。使用matlab求解线性规划问题,可以不用编写程序,MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。

以上就是关于跪求!!SLM衍射特性研究及衍射光学元件设计实验的思路以及思想。。 另外,跪求GS算法的介绍!!全部的内容,包括:跪求!!SLM衍射特性研究及衍射光学元件设计实验的思路以及思想。。 另外,跪求GS算法的介绍!!、MATLAB遗传算法、跪求各位matlab大神指导!如何在matlab里编译同伦算法程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/zz/9693573.html

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

发表评论

登录后才能评论

评论列表(0条)

保存