优化算法之遗传算法及其matlab实现

一.进化论知识 

作为遗传算法生物背景的介绍,下面内容了解即可:

  种群(Population)生物的进化以群体的形式进行,这样的一个群体称为种群。

  个体:组成种群的单个生物。

  基因 ( Gene ) 一个遗传因子。 

  染色体 ( Chromosome ) :包含一组的基因。

  生存竞争,适者生存:对环境适应度高的、牛B的个体参与繁殖的机会比较多,后代就会越来越多。适应度低的个体参与繁殖的机会比较少,后代就会越来越少。

  遗传与变异:新个体会遗传父母双方各一部分的基因,同时有一定的概率发生基因变异。

简单说来就是:繁殖过程,会发生基因交叉( Crossover ) ,基因突变 ( Mutation ) ,适应度( Fitness )低的个体会被逐步淘汰,而适应度高的个体会越来越多。那么经过N代的自然选择后,保存下来的个体都是适应度很高的,其中很可能包含史上产生的适应度最高的那个个体。

二.遗传算法思想 

借鉴生物进化论,遗传算法将要解决的问题模拟成一个生物进化的过程,通过复制、交叉、突变等操作产生下一代的解,并逐步淘汰掉适应度函数值低的解,增加适应度函数值高的解。这样进化N代后就很有可能会进化出适应度函数值很高的个体。

举个例子,使用遗传算法解决“0-1背包问题”的思路:0-1背包的解可以编码为一串0-1字符串(0:不取,1:取) ;首先,随机产生M个0-1字符串,然后评价这些0-1字符串作为0-1背包问题的解的优劣;然后,随机选择一些字符串通过交叉、突变等操作产生下一代的M个字符串,而且较优的解被选中的概率要比较高。这样经过G代的进化后就可能会产生出0-1背包问题的一个“近似最优解”。

  编码:需要将问题的解编码成字符串的形式才能使用遗传算法。最简单的一种编码方式是二进制编码,即将问题的解编码成二进制位数组的形式。例如,问题的解是整数,那么可以将其编码成二进制位数组的形式。将0-1字符串作为0-1背包问题的解就属于二进制编码。假设x1,x2同为0~7的整数。那么其可以编码为3位2进制,即110111可等同于x1,x2=[6,7]。我们需要在编程的时候编写编解码程序。

遗传算法有3个最基本的操作:选择,交叉,变异。

  选择:选择一些染色体来产生下一代。一种常用的选择策略是 “比例选择”,也就是个体被选中的概率与其适应度函数值成正比。假设群体的个体总数是M,那么那么一个体Xi被选中的概率为f(Xi)/( f(X1) + f(X2) + …….. + f(Xn) ) 。比例选择实现算法就是所谓的“轮盘赌算法”( Roulette Wheel Selection ) ,轮盘赌算法的一个简单的实现如下:(matlab)

function RWS(p)

rand(‘state’,sum(clock);

% assume that p(i) has been initialized

r = rand(1,1);

psum = 0;

for i = 1:length(p)

    psum = psum + p(i);

    if psum>=r,

        chose = i;

        return;

    end

end

初始化一个 p = [ 0.1 0.3 0.4 0.2];

>> RWS(p)

ans = 3

交叉(Crossover):2条染色体交换部分基因,来构造下一代的2条新的染色体。例如:

交叉前:

00000|011100000000|10000

11100|000001111110|00101

交叉后:

00000|000001111110|10000

11100|011100000000|00101

染色体交叉是以一定的概率发生的,这个概率记为Pc 。

 

变异(Mutation):在繁殖过程,新产生的染色体中的基因会以一定的概率出错,称为变异。变异发生的概率记为Pm 。例如:

变异前:

000001110000000010000

变异后:

000001110000100010000

 

适应度函数 ( Fitness Function ):用于评价某个染色体的适应度,用f(x)表示。有时需要区分染色体的适应度函数与问题的目标函数。例如:0-1背包问题的目标函数是所取得物品价值,但将物品价值作为染色体的适应度函数可能并不一定适合。适应度函数与目标函数是正相关的,可对目标函数作一些变形来得到适应度函数。

为了更好的理解先看一段伪代码吧。

基本遗传算法伪代码

/*
* Pc:交叉发生的概率
* Pm:变异发生的概率
* M:种群规模
* G:终止进化的代数
* Tf:进化产生的任何一个个体的适应度函数超过Tf,则可以终止进化过程
*/
初始化Pm,Pc,M,G,Tf等参数。随机产生第一代种群Pop

do
{
计算种群Pop中每一个体的适应度F(i)。
初始化空种群newPop
do
{
根据适应度以比例选择算法从种群Pop中选出2个个体   //选择
if ( random ( 0 , 1 ) < Pc )
{
对2个个体按交叉概率Pc执行交叉操作   //交叉
}
if ( random ( 0 , 1 ) < Pm )
{
对2个个体按变异概率Pm执行变异操作  //变异
}
将2个新个体加入种群newPop中
} until ( M个子代被创建 )
用newPop取代Pop     //适应度函数的判断或繁殖代数超过一定后终止循环
}until ( 任何染色体得分超过Tf, 或繁殖代数超过G )

三.基本遗传算法优化 

下面的方法可优化遗传算法的性能。

  精英主义(Elitist Strategy)选择:是基本遗传算法的一种优化。为了防止进化过程中产生的最优解被交叉和变异所破坏,可以将每一代中的最优解原封不动的复制到下一代中。

  插入操作:可在3个基本操作的基础上增加一个插入操作。插入操作将染色体中的某个随机的片段移位到另一个随机的位置。

 

 

三.飞机巡航路线遗传算法优化的matlab实现 

飞机巡航数据

function gasim()
disp(‘模拟退火求巡航路径’);
data=xlsread(‘飞机巡航数据.xlsx’,’sheet1′,’C4:J28′);
x=data(:,1:2:8);x=x(:);
y=data(:,2:2:8);y=y(:);
sj=[x y];
d1=[70,40];
sj0=[d1;sj;d1];
%距离矩阵d
sj=sj0*pi/180;
d=zeros(102);
for i=1:101
for j=i+1:102
temp=cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*cos(sj(j,2))+sin(sj(i,2))*sin(sj(j,2));
d(i,j)=6370*acos(temp);
end
end
d=d+d’;L=102;w=50;dai=100; %w指的是种群的大小
%通过改良圈算法选取优良父代A
for k=1:w
c=randperm(100);
c1=[1,c+1,102];
flag=1;
while flag>0
flag=0;
for m=1:L-3
for n=m+2:L-1
if d(c1(m),c1(n))+d(c1(m+1),c1(n+1))<d(c1(m),c1(m+1))+d(c1(n),c1(n+1)) %交换两个节点的顺序
flag=1;
c1(m+1:n)=c1(n:-1:m+1);
end
end
end
end
J(k,c1)=1:102; %矩阵J的第k行的第c1列的值依次为1:102 %J就是取出来的50个优良的父代
end
J=J/102;
J(:,1)=0;
J(:,102)=1;
rand(‘state’,sum(clock));
%遗传算法实现过程
pby = 0.01; %变异概率
A=J;
for k=1:dai
B=A;
c=randperm(w); %打乱顺序, 产生配对
%交配产生子代B
for i=1:2:w
F1=2+floor(100*rand(1)); %随机选择交换开始的位置
F2=2+floor(100*rand(1)); %随机选择交换结束的位置
if(F1>F2),
tempf = F1;
F1 = F2;
F2 = tempf;
end
%交换相邻染色体的基因
temp=B(c(i),F1:F2);
B(c(i),F1:F2)=B(c(i+1),F1:F2);
B(c(i+1),F1:F2)=temp;
end
%变异产生子代C
by=find(rand(1,w)<pby); % 比pby小的都发生变异
if length(by)==0 % 如果没有变异的, 就随机产生一个
by=floor(w*rand(1))+1;
end
C=A(by,:); % 提取出变异的
L3=length(by);
for j=1:L3 % 交换片段
bw=2+floor(100*rand(1,3)); %产生3个节点, 便于交换两个片段的位置
bw=sort(bw);
C(j,:)=C(j,[1:bw(1)-1,bw(2)+1:bw(3),bw(1):bw(2),bw(3)+1:102]);
end

%将ABC组合起来
G=[A;B;C]; % A父代 B子代 C变异的后代
TL=size(G,1); %TL是G的行数
%在父代和子代中选择优良品种作为新的父代,保证留下最优解
[dd,IX]=sort(G,2);%dd是行升序重排后的结果,IX是索引值
temp(1:TL)=0; %初始化temp
for j=1:TL
for i=1:101
temp(j)=temp(j)+d(IX(j,i),IX(j,i+1)); %求出G中每一种排列的路径和
end
end
[DZ,IZ]=sort(temp);
A=G(IZ(1:w),:); %拿出前五十个排列作为优秀父代进行再次重排
end
path=IX(IZ(1),:) %输出最优解
long=DZ(1)
v=xlsread(‘飞机巡航数据.xlsx’,’sheet1′,’A2′); %得到巡航速度
time=long/v(1,1) %输出所花时间
xx=sj0(path,1);yy=sj0(path,2);
plot(xx,yy,’-o’)

最后得到的图和上一篇里用模拟退火算法得到的差不多,可以自行运行,这里就不贴图了

优化算法之模拟退火算法及matlab示例

一、原理

模拟退火是一种贪心算法,但是它的搜索过程引入了随机因素。模拟退火算法以一定的概率来接受一个比当前解要差的解,因此有可能会跳出这个局部的最优解,达到全局的最优解。以图1为例,模拟退火算法在搜索到局部最优解A后,会以一定的概率接受到E的移动。也许经过几次这样的不是局部最优的移动后会到达D点,于是就跳出了局部最大值A。

模拟退火算法描述:

若J( Y(i+1) )>= J( Y(i) )  (即移动后得到更优解),则总是接受该移动

若J( Y(i+1) )< J( Y(i) )  (即移动后的解比当前解要差),则以一定的概率接受移动,而且这个概率随着时间推移逐渐降低(逐渐降低才能趋向稳定)

这里的“一定的概率”的计算参考了金属冶炼的退火过程,这也是模拟退火算法名称的由来。

根据热力学的原理,在温度为T时,出现能量差为dE的降温的概率为P(dE),表示为:

    P(dE) = exp( dE/(kT) )

其中k是一个常数,exp表示自然指数,且dE<0。这条公式说白了就是:温度越高,出现一次能量差为dE的降温的概率就越大;温度越低,则出现降温的概率就越小。又由于dE总是小于0(否则就不叫退火了),因此dE/kT < 0 ,所以P(dE)的函数取值范围是(0,1) 。

随着温度T的降低,P(dE)会逐渐降低。

我们将一次向较差解的移动看做一次温度跳变过程,我们以概率P(dE)来接受这样的移动。

二、示例

(i). 旅行商问题

旅行商问题 ( TSP , Traveling Salesman Problem ) :有N个城市,要求从其中某个问题出发,唯一遍历所有城市,再回到出发的城市,求最短的路线。

旅行商问题属于所谓的NP完全问题,精确的解决TSP只能通过穷举所有的路径组合,其时间复杂度是O(N!) 。

使用模拟退火算法可以比较快的求出TSP的一条近似最优路径。(使用遗传算法也是可以的,我将在下一篇文章中介绍)模拟退火解决TSP的思路:

1. 产生一条新的遍历路径P(i+1),计算路径P(i+1)的长度L( P(i+1) )

2. 若L(P(i+1)) < L(P(i)),则接受P(i+1)为新的路径,否则以模拟退火的那个概率接受P(i+1) ,然后降温

3. 重复步骤1,2直到满足退出条件

产生新的遍历路径的方法有很多,下面列举其中3种:

1. 随机选择2个节点,交换路径中的这2个节点的顺序。

2. 随机选择2个节点,将路径中这2个节点间的节点顺序逆转。

3. 随机选择3个节点m,n,k,然后将节点m与n间的节点移位到节点k后面。

(ii).飞机巡航问题及其matlab实现

我方有一个基地,经度和纬度为(70,40)。假设我方飞机的速度为1000公里/小时。
我方派一架飞机从基地出发,侦察完敌方所有目标,再返回原来的基地。在敌方每一目
标点的侦察时间不计,求该架飞机所花费的时间(假设我方飞机巡航时间可以充分长)。
这是一个旅行商问题。我们依次给基地编号为1,敌方目标依次编号为2,3,…,
101,最后我方基地再重复编号为102(这样便于程序中计算)。

飞机巡航数据

function mySim()
disp(‘模拟退火求巡航路径’);
data=xlsread(‘飞机巡航数据.xlsx’,’sheet1′,’C4:J28′);
x=data(:,1:2:8);x=x(:)
y=data(:,2:2:8);y=y(:);
si=[x y]; d1=[70,40];
si=[d1;si;d1]; %构成一个环
sj=si;
sj=sj*pi/180; %经纬度化为弧度制
d=zeros(102); %距离矩阵d
for i=1:101
for j=i+1:102 %右上三角矩阵
temp=cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*cos(sj(j,2))+ …
sin(sj(i,2))*sin(sj(j,2));
d(i,j)=6370*acos(temp);
end
end
d=d+d’; %生成距离矩阵
S0=[]; %用于存放最优路径
Sum=inf; %用于存放最优解
rand(‘state’,sum(clock)); %设随机种子,因为计算机产生的都是伪随机数,
%所以我们采用rand(‘state’,sum(clock))来重新设定随机数产生的时间
for j=1:1000
S=[1 1+randperm(100),102]; %randperm(n)用于随机生成1到n的一个排列
temp=0;
for i=1:101
temp=temp+d(S(i),S(i+1)); %求得一个所有的距离和
end
if temp<Sum %更新最小和
S0=S;Sum=temp;
end
end
% 随机解产生完毕
e=0.1^30;L=20000;at=0.999;T=1; %设定温度阈值,最大步长,温度衰减系数,初始温度

%退火过程
for k=1:L
%产生新解
c=2+floor(100*rand(1,2)); %floor向下取整,rand(m,n)生成m*n阶(0,1)随机矩阵
c=sort(c); %顺序排列
c1=c(1);c2=c(2);
%计算代价函数值, 即上述方法中的第一种, 随机选择2个节点,交换路径中的这2个节点的顺序。
df=d(S0(c1-1),S0(c2))+d(S0(c1),S0(c2+1))-d(S0(c1-1),S0(c1))-d(S0(c2),S0(c2+1));
%接受准则
if df<0 %说明更换节点顺序后的方法更好
S0=[S0(1:c1-1),S0(c2:-1:c1),S0(c2+1:102)];
Sum=Sum+df;
elseif exp(-df/T)>rand(1) %否则以退火概率接受当前解
S0=[S0(1:c1-1),S0(c2:-1:c1),S0(c2+1:102)];
Sum=Sum+df;
end
T=T*at; %更新温度
if T<e %如果已经几乎冷却,则停止(0℃)
break;
end
end
% 输出巡航路径及路径长度
S0,Sum
%巡航时间
v=xlsread(‘飞机巡航数据.xlsx’,’sheet1′,’A2′); %得到巡航速度
time=Sum/v(1,1)
%画出路径图
r=size(sj,1);
for i=1:r-1;
plot(si(S0(i),1),si(S0(i),2),si(S0(i+1),1),si(S0(i+1),2),’*’);
text(si(S0(i),1)-0.5,si(S0(i),2)+0.5,num2str(S0(i)));
if i~=101,
text(si(S0(i+1),1)-0.5,si(S0(i+1),2)+0.5,num2str(S0(i+1)));
end
line([si(S0(i),1) si(S0(i+1),1)],[si(S0(i),2) si(S0(i+1),2)]);
title(‘飞机巡航路线(By un1q.me)’);
hold on
end

最后,可以得到以下所示图形及结果:

Sum =

4.5107e+04
time =

45.1073

untitled

高效使用matlab的一些总结

一、向量预分配:

我们在编程的时候,经常会这样写:

function ex()

for i = 1:100,
data(i) = i;
end
这个函数的功能是,把1-100不断地存放到data中。

而实际上,在执行这个循环的过程中,MATLAB会执行很多次循环。因为每次都要把旧数据拷贝到新地址,这些分配内存和拷贝数据的工作很费时间。而且由于在一小段时间,新旧数据必须同时存在于内存中,所以内存峰值有可能达到实际所需的两倍。如果我们直接预先分配了空间,就不存在这些问题了:

function ex()

data = zeros(100,1);

for i = 1:100
data(i) = i;
end

当矩阵很大时,这种预分配尤其重要。

二、用内建函数代替for循环

在使用Matlab进行矩阵计算的时候,经常会遇到要使用for循环的情况。但其实很多操作可以用内部的一些函数代替。今天总结一些几个函数的用法: bsxfun, arrayfun, cellfun, spfun, structfun。

C = bsxfun(fun,A,B)

Eg:

Subtract the column means from the matrix A:

A = magic(5); A = bsxfun(@minus, A, mean(A));

 

bsxfun可以对矩阵A和矩阵B进行对应元素的fun函数操作。其中,fun是任何标量输入输出的二元操作的函数,例如基本的加减乘除,三角函数,大小比较,以及其他任何符合条件的自定义函数。

注意,fun不能是符号,例如+,*之类,这些符号都有对应的函数名。例如+ 对应 plus, >= 对应 ge,等等。可以通过matlab命令行输入

help <运算符号> 来查询。

一般来说,如果两个矩阵一样大,我们可以直接通过 A+B 这样的方式一样实现,但是bsxfun有一个优点,就是当A,B中任何一维长度为1的时候,函数会自动将该维度和另一个矩阵对应维度的每一行(列)进行运算。如果我们自己进行这样的操作,我们或者要使用循环,或者要使用repmat来扩展矩阵,这都比bsxfun在底层内部实现慢很多,或者要消耗更多内存。

[B1,…,Bm] = arrayfun(func,A1,…,An,Name,Value)

这个函数可以直接对数组中的元素进行func函数操作。其中,func函数接受n个输入,m个输出。当输出可以进行合并的时候,可以设置 ‘UniformOutput’ 为true,这样所有 A1..An经过func的第m个输出就会合并为一个数组 Bm,如果’UniformOutput’为false,表示不同输入元素对应的输出不能合并,这样每个Bm就会是一个cell。

cellfun: 与arrayfun的功能差不多,不同只是在对cell操作。

f = spfun(fun,x)

这个函数能够对稀疏矩阵中的每一个有值的元素进行操作。

这个函数的用途不仅仅是可以提升速度,更重要的是能够保持返回的f中,没有数据的地方依然为0. 例如:

S = sparse(4,4);

S(1,1) = 4;

f = spfun(@exp,S);

f =

(1,1)  54.5982

而直接运行的话,没有值的地方都会变成exp(0) = 1了。

第一次美赛后的latex用法小结

第一次做,完全要靠自己写一个适合我们队使用的模版出来,还是挺麻烦的~

必须要做一些总结性的东西方便今后使用,不管为了mcm还是别的,多学学总是好的。慢慢更新。

 

1. latex公式中空格的表示

两个quad空格 a \qquad b a \qquad b 两个m的宽度
quad空格 a \quad b a \quad b 一个m的宽度
大空格 a\ b a\ b 1/3m宽度
中等空格 a\;b a\;b 2/7m宽度
小空格 a\,b a\,b 1/6m宽度
没有空格 ab ab\,
紧贴 a\!b a\!b 缩进1/6m宽度

2. 表格的位置问题

表格总是自动跑到所在页的页首,为了让表格出现在该页上应该出现的位置——比如出现在页首的几行文字之后,只要在\begin{table}这句之前加上代码:

\makeatletter\def\@captype{table}\makeatother

然后将\begin{table}\end{table}删除即可。

3.表格文字内容过多自动换行

\begin{tabular}{p{2cm}<{\centering}|p{11.8cm}}

\hline   %划横线方式

1 & the first line //

\end{tabular}

在Matlab中将三维离散点构造网格后画mesh

这个事儿源于2013MCM的盘子题~,求各种奇奇怪怪的盘子受热分布问题。具体的就不给了,
在这里大概说一下思路:

知道一系列点的坐标如下(1.486,3.059,0.1);(2.121,4.041,0.1);(2.570,3.959,0.1);(3.439,4.396,0.1);(4.505,3.012,0.1);(3.402,1.604,0.1);(2.570,2.065,0.1);(2.150,1.970,0.1);(1.794,3.059,0.2);(2.121,3.615,0.2);(2.570,3.473,0.2);(3.421,4.160,0.2);(4.271,3.036,0.2);(3.411,1.876,0.2);(2.561,2.562,0.2);(2.179,2.420,0.2);(2.757,3.024,0.3);(3.439,3.970,0.3);(4.084,3.036,0.3);(3.402,2.077,0.3);(2.879,3.036,0.4);(3.421,3.793,0.4);(3.953,3.036,0.4);(3.402,2.219,0.4);(3.000,3.047,0.5);(3.430,3.639,0.5);(3.822,3.012,0.5);(3.411,2.385,0.5);(3.103,3.012,0.6);(3.430,3.462,0.6);(3.710,3.036,0.6);(3.402,2.562,0.6);(3.224,3.047,0.7);(3.411,3.260,0.7);(3.542,3.024,0.7);(3.393,2.763,0.7)怎样用MATLAB绘制成三维曲面呢?

使用griddata插值

A=[1.486,3.059,0.1;2.121,4.041,0.1;2.570,3.959,0.1;3.439,4.396,0.1; 4.505,3.012,0.1;3.402,1.604,0.1;2.570,2.065,0.1;2.150,1.970,0.1; 1.794,3.059,0.2;2.121,3.615,0.2;2.570,3.473,0.2;3.421,4.160,0.2; 4.271,3.036,0.2;3.411,1.876,0.2;2.561,2.562,0.2;2.179,2.420,0.2; 2.757,3.024,0.3;3.439,3.970,0.3;4.084,3.036,0.3;3.402,2.077,0.3; 2.879,3.036,0.4;3.421,3.793,0.4;3.953,3.036,0.4;3.402,2.219,0.4; 3.000,3.047,0.5;3.430,3.639,0.5;3.822,3.012,0.5;3.411,2.385,0.5; 3.103,3.012,0.6;3.430,3.462,0.6;3.710,3.036,0.6;3.402,2.562,0.6; 3.224,3.047,0.7;3.411,3.260,0.7;3.542,3.024,0.7;3.393,2.763,0.7];

x=A(:,1);y=A(:,2);z=A(:,3);

scatter(x,y,z)%散点图

figure

[X,Y,Z]=griddata(x,y,z,linspace(min(x):max(x))’,linspace(min(y),max(y)),’v4′);%插值

pcolor(X,Y,Z);shading interp%伪彩色图

figure,contourf(X,Y,Z) %等高线图

figure,surf(X,Y,Z)%三维曲面

这里特别注意的是,当点特别多的时候,比较杂的时候

可能插值效果就不好了,

这里我们可以利用边界条件将超出边界的点置为NaN

就可以得到完美的显示了

在对圆锥类处理时能得到较好的结果,但是对多边形形成的三维图像就不太好了,

建议使用surf() + mesh() 的方法。

Latex基本用法

前阵考试确实太久没有发点干货和充实自己了…
今儿温习下latex的基本用法为假期的美赛做准备…顺便写个基本用法总结
各位看官有兴趣的瞧瞧便是…

1.第一个文档
打开WinEdt,建立一个新文档,将以下内容复制进入文档中,保存,保存类型选择为UTF-8。

\documentclass{article}
\begin{document}
hello, G
\end{document}

然后在WinEdt的工具栏中找到编译按钮(在垃圾桶和字母B中间),在下拉菜单中选择XeTeX,并点击编译。
如果顺利的话,我们就可以顺利生成出第一个pdf文件,点击工具栏中的放大镜按钮就可以快速打开生成的pdf文件。

2.标题、作者和注释
建立一个新文档,将以下内容复制进入文档中,保存,保存类型选择为UTF-8,编译并观察现象。

\documentclass{article}
\author{Qing Zhu}
\title{Just for a try}
\begin{document}
\maketitle
hello, G % This is comment
\end{document}

3.章节和段落
建立一个新文档,将以下内容复制进入文档中,保存,保存类型选择为UTF-8,编译并观察现象。

\documentclass{article}
\title{Hello G}
\begin{document}
\maketitle
\section{Hello G} G is a good people.
\subsection{N} N
\subsubsection{O}
\paragraph{T}hing
\subparagraph{On} You
\subsection{Nothing} On you
\end{document}

退格只是码农的偏好…

4.加入目录
建立一个新文档,将以下内容复制进入文档中,保存,保存类型选择为UTF-8,编译并观察现象。

\documentclass{article}
\begin{document}
\tableofcontents
\section{Hello G} G is a good people.
\subsection{N} N
\subsubsection{O}
\paragraph{T}hing
\subparagraph{On} You
\subsection{Nothing} On you
\end{document}

6.换行
建立一个新文档,将以下内容复制进入文档中,保存,保存类型选择为UTF-8,编译并观察现象。
\documentclass{article}
\begin{document}
G
G
is \\ a \\
Good people.
\end{document}

7.数学公式
建立一个新文档,将以下内容复制进入文档中,保存,保存类型选择为UTF-8,编译并观察现象。

\documentclass{article}
\usepackage{amsmath}
\usepackage{amssymb}
\begin{document}
The Newton’s second law is F=ma.

The Newton’s second law is $F=ma$.

The Newton’s second law is
$$F=ma$$

The Newton’s second law is
\[F=ma\]

Greek Letters $\eta$ and $\mu$

Fraction $\frac{a}{b}$

Power $a^b$

Subscript $a_b$

Derivate $\frac{\partial y}{\partial t} $

Vector $\vec{n}$

Bold $\mathbf{n}$

To time differential $\dot{F}$

Matrix (lcr here means left, center or right for each column)
\[
\left[
\begin{array}{lcr}
a1 & b22 & c333 \\
d444 & e555555 & f6
\end{array}
\right]
\]

Equations(here \& is the symbol for aligning different rows)
\begin{align}
a+b&=c\\
d&=e+f+g
\end{align}

\[
\left\{
\begin{aligned}
&a+b=c\\
&d=e+f+g
\end{aligned}
\right.
\]

\end{document}

具体细节可以自行搜索LaTeX的数学符号表或别人给的例子。

8.插入图片
先搜索到一个将图片转成eps文件的软件,很容易找的,然后将图片保存为一个名字如figure1.eps。
建立一个新文档,将以下内容复制进入文档中,保存,保存类型选择为UTF-8,放在和图片文件同一个文件夹里,编译并观察现象。

\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics[width=4.00in,height=3.00in]{untitled.eps} %using eps
\includegraphics[width=0.8\textwidth]{untitled.jpg} %using jpg
\end{document}
注意:
(1)eps文件和tex文件放在同一个文件夹,只用文件名就可以调用,不用写路径。
(2)使用编译时不能使用pdflatex,会出错。即使不出错,也看不到图。应使用latex编译生成dvi,然后dvi2ps,ps2pdf就可以看到图了。

9.简单表格
建立一个新文档,将以下内容复制进入文档中,保存,保存类型选择为UTF-8,编译并观察现象。

\documentclass{article}
\begin{document}
\begin{tabular}{|c|c|}
a & b \\
c & d\\
\end{tabular}

\begin{tabular}{|c|c|}
\hline
a & b \\
\hline
c & d\\
\hline
\end{tabular}

\begin{center}
\begin{tabular}{|c|c|}
\hline
a & b \\ \hline
c & d\\
\hline
\end{tabular}
\end{center}
\end{document}

以上是基本用法了,很实用。足够写一个自我介绍了。

WinEdt试用到期解决方法

作为一个刚考完试没剧看没事干的宅货。。(刚去电影院看完重返20岁,感动到Cry)
打开WinEdt准备再次熟悉奔赴美国赛。。然后就发现WINEDT试用期到了。。
给个解决方法:(不过每一个月都得弄一次,管用)
程序—运行-(regedit)—HKEY_CURRENT_USER—software—winedt
删掉整个 winedt 子目录.
这个方子每次可以保证30天的清静.