黄金分割法编程
- 格式:pptx
- 大小:423.53 KB
- 文档页数:12
大智慧黄金分割线主图指标公式编程思路破译和风险提示DRAWGBKLAST(成交量(手)>1,STRIP(自定色,自定色,0))输出AH:HHVALL(最高价)输出 AL:LLVALL(最低价)AHL赋值:AH-AL输出A19:AL+AHL*0.191,COLORAAAAAA输出A38:AL+AHL*0.382,COLOR00AAAA输出A50:AL+AHL*0.500,线宽为1,POINTDOT,画绿色输出A61:AL+AHL*0.618,COLOR00AAAA输出A80:AL+AHL*0.809,COLORAAAAAAY赋值:999DRAWTEXTREL(0,0,'100% '+AH),COLORAAAAAA DRAWTEXTREL(0,Y*0.191,'0.809% '+A80),COLORAAAAAA DRAWTEXTREL(0,Y*0.382,'0.618% '+A61),COLOR00AAAA DRAWTEXTREL(0,Y*0.500,'0.50% '+A50),COLOR00AAAA DRAWTEXTREL(0,Y*0.618,'0.382% '+A38),COLOR00AAAA DRAWTEXTREL(0,Y*0.809,'0.191% '+A19),COLORAAAAAA DRAWTEXTREL(0,Y-30,'最高 '+AH),COLORAAAAAA DRAWTEXTREL(900,0,'100% '+AH),COLORAAAAAA DRAWTEXTREL(900,Y*0.191,'0.809% '+A80),COLORAAAAAA DRAWTEXTREL(900,Y*0.382,'0.618% '+A61),COLOR00AAAA DRAWTEXTREL(900,Y*0.500,'0.50% '+A50),COLOR00AAAA DRAWTEXTREL(900,Y*0.618,'0.382% '+A38),COLOR00AAAA DRAWTEXTREL(900,Y*0.809,'0.191% '+A19),COLORAAAAAA DRAWTEXTREL(900,Y-30,'最高 '+AH),COLORAAAAAAW赋值:上次DISPSTATUS=1距今天数P赋值:若DISPSTATUS=2则将最近W/2+1周期置为1 VERTLINE(P上穿0.5,4),COLOR889999 DRAWTEXTREL(500,0,'最高' ),画红色DRAWTEXTREL(500,900+76,'最低'),COLOR00FF00DRAWTEXTREL(500,0.50*(900+76),'0.5'),COLOR0099FFDRAWTEXTREL(500,0.191*(900+76),'0.809'),画黄色DRAWTEXTREL(500,0.382*(900+76),'0.618'),画黄色DRAWTEXTREL(500,0.618*(900+76),'0.382'),画黄色DRAWTEXTREL(500,0.809*(900+76),'0.191'),画黄色RSV赋值:(((收盘价 - 13日内最低价的最低值) / (13日内最高价的最高值 - 13日内最低价的最低值)) * 100)K赋值:RSV的3日[1日权重]移动平均D赋值:K的3日[1日权重]移动平均J赋值:((3 * K) - (2 * D))RSV24赋值:(((收盘价- 55日内最低价的最低值) / (55日内最高价的最高值 - 55日内最低价的最低值)) * 100)K24赋值:RSV24的3日[1日权重]移动平均D24赋值:K24的3日[1日权重]移动平均J24赋值:((3 * K24) - (2 * D24))压力位赋值:如果J24上穿J,返回最高价,否则返回上次J24上穿J 距今天数日前的最高价支撑位赋值:如果J上穿J24,返回最低价,否则返回上次J上穿J24距今天数日前的最低价TJ赋值:如果(收盘价-1日前的收盘价)/1日前的收盘价>0.025,返回1,否则返回0YL赋值:如果收盘价>上次TJ=1距今天数日前的开盘价,返回上次TJ=1距今天数日前的开盘价,否则返回0FT赋值:上次YL距今天数YLX赋值:FT日前的YLBT赋值:如果收盘价<OPENANDREF(收盘价,1)>1日前的开盘价,返回1日前的收盘价,否则返回0XFT赋值:上次BT距今天数XYLX赋值:XFT日前的BT平台调下赋值:XYLX上穿收盘价平台突破赋值:收盘价上穿YLXVAR2赋值:1日前的最低价VAR3赋值:最低价-VAR2的绝对值的13日[1日权重]移动平均/最低价-VAR2和0的较大值的13日[1日权重]移动平均*100 VAR4赋值:如果收盘价*1.2,返回VAR3*13,否则返回VAR3/13的13日指数移动平均VAR5赋值:34日内最低价的最低值VAR6赋值:34日内VAR4的最高值VAR7赋值:如果56日内最低价的最低值,返回1,否则返回0VAR8赋值:如果最低价<=VAR5,返回(VAR4+VAR6*2)/2,否则返回0的3日指数移动平均/618*VAR7主力进场赋值:VAR8>1日前的VAR8进场赋值:1日前的主力进场当满足条件进场AND平台突破时,在最低价*0.97位置书写文字,ALIGN1,COLOR0000FF当满足条件进场AND平台突破时,在最低价*0.94位置书写文字,ALIGN1,COLOR0000FF当满足条件进场AND平台突破ANDL=支撑位时,在最低价*0.93位置画1号图标,ALIGN1,VALIGN2风险提示该公式包含未来函数:BACKSET。
黄金分割法python代码黄金分割法是一种古老而神秘的比例,它可以在许多不同的领域中发挥作用。
在数学上,它是一种简单而优美的比例,被广泛用于建筑、绘画和美学等领域。
在计算机科学中,黄金分割法也被用于优化算法的设计,特别是在搜索和排序方面。
本文将介绍黄金分割法的定义、性质和应用,并提供Python代码实现。
1. 黄金分割法的定义黄金分割法是指将一条线段分割成两部分,使其中一部分与整条线段的比例等于另一部分与这部分的比值相等,即A/B = B/(A+B)。
这个比例被称为黄金比例,也被称为“神圣的比例”。
黄金比例的近似值是1.61803398875,它是一个无限不循环的小数,也是一个无理数。
黄金比例的近似值可以通过求解方程x^2=x+1来得到,其中x是黄金比例的值。
这个方程的正根就是黄金比例的值。
2. 黄金分割法的性质黄金分割法有许多有趣的性质,其中一些包括:(1)黄金比例的平方等于黄金比例加1,即φ^2=φ+1;(2)黄金比例的倒数等于黄金比例减1,即1/φ=φ-1;(3)黄金比例是一种最优比例,它可以使得两个部分的比例在视觉上感觉最为和谐和美丽。
3. 黄金分割法的应用黄金分割法在建筑、绘画、美学等领域中有广泛的应用。
例如,在建筑中,黄金分割法可以用来设计建筑物的比例和比例关系,以创造出最美丽的效果。
在绘画中,黄金分割法可以用来设计画面的比例和构图,以创造出最和谐的效果。
在美学中,黄金分割法可以用来评估和设计美的标准。
在计算机科学中,黄金分割法也有着广泛的应用。
特别是在搜索和排序算法中,黄金分割法被用于优化算法的设计。
例如,在二分查找算法中,可以将搜索区间按照黄金比例分割,以减少搜索次数和时间复杂度。
在排序算法中,可以将数组按照黄金比例分割成多个子数组,然后使用递归算法进行排序,以减少排序时间和空间复杂度。
4. Python代码实现以下是使用Python实现黄金分割法的代码,其中使用了递归算法来计算黄金比例的近似值。
进退法试用进退法确定函数f(x)=3x2+8x+9的初始单峰区间,设定给定的初始值x0=0,初始步长h=0.1。
#include <math.h>#include <stdlib.h>#include <stdio.h>main(){float x0=0,x1,x2;float h=0.1;double f1,f2;printf("请输入初始点,初始步长。
\n");/*scanf("%f%f\n",&x0,&h);*/x1=x0;x2=x1+h;printf("%f,%f\n",x1,x2);f1=3*pow(x1,2)-8*x1+9;f2=3*pow(x2,2)-8*x2+9;printf("%f,%f\n",f1,f2);if(f1>f2) {ss:h=2*h;x2=x2+h;f1=f2;f2=3*pow(x2,2)-8*x2-9;if(f2>f1)printf("区间是%f,%f\n",x1,x2);else {x1=x2-h;if(f1==f2)printf("区间是%f,%f\n",x1,x2);else goto ss;}}else{if(f2==f1)printf("区间是%f,%f\n",x1,x2);else{h=-h/4;kk: x1=x1+h;f2=f1;f1=3*pow(x1,2)-8*x1-9;if(f2<f1)printf("区间是%f,%f\n",x1,x2);else{x2=x1-h;if(f1=f2)printf("区间是%f,%f\n",x1,x2);else{h=2*h;goto kk;}}}}}输出正确结果:(0.7,3.1)黄金分割法试用黄金分割法求一元函数minf(x)=x2+6x+9的最优解。
最优化⽅法三分法+黄⾦分割法+⽜顿法最优化_三等分法+黄⾦分割法+⽜顿法⼀、实验⽬的1. 掌握⼀维优化⽅法的集中算法;2. 编写三分法算法3. 编写黄⾦分割法算法4. 编写⽜顿法算法⼆、系统设计三分法1.编程思路:三分法⽤于求解单峰函数的最值。
对于单峰函数,在区间内⽤两个mid将区间分成三份,这样的查找算法称为三分查找,也就是三分法。
在区间[a,b]内部取n=2个内等分点,区间被分为n+1=3等分,区间长度缩短率=1 3 .各分点的坐标为x k=a+b−an+1⋅k (k=1,2) ,然后计算出x1,x2,⋯;y1,y2,⋯;找出y min=min{y k,k=1,2} ,新区间(a,b)⇐(x m−1,x m+1) .coding中,建⽴left,mid1,mid2,right四个变量⽤于计算,⽤新的结果赋值给旧区间即可。
2.算法描述function [left]=gridpoint(left,right,f)epsilon=1e-5; %给定误差范围while((left+epsilon)<right) %检查left,right区间精度margin=(right-left)/3; %将区间三等分,每⼩段长度=marginm1=left+margin; %left-m1-m2-right,三等分需要两个点m2=m1+margin; %m2=left+margin+marginif(f(m1)<=f(m2))right=m2; %离极值点越近,函数值越⼩(也有可能越⼤,视函数⽽定)。
else %当f(m1)>f(m2),m2离极值点更近。
缩⼩区间范围,逼近极值点left=m1; %所以令left=m1.endend %这是matlab的.m⽂件,不⽤写return.黄⾦分割法1.编程思路三分法进化版,区间长度缩短率≈0.618.在区间[a,b]上取两个内试探点,p i,q i要求满⾜下⾯两个条件:1.[a i,q i]与[p i,b i]的长度相同,即b i−p i=q i−a i;2.区间长度的缩短率相同,即b i+1−a i+1=t(b i−a i)]2.算法描述⾃⼰编写的:function [s,func_s,E]=my_golds(func,left,right,delta)tic%输⼊: func:⽬标函数,left,right:初始区间两个端点% delta:⾃变量的容许误差%输出: s,func_s:近似极⼩点和函数极⼩值% E=[ds,dfunc] ds,dfunc分别为s和dfunc的误差限%0.618法的改进形式:每次缩⼩区间时,同时⽐较两内点和两端点处的函数值。
黄金分割法学习目标➢理解单谷函数及其性质➢理解黄金分割法的基本原理➢掌握黄金分割法的步骤➢编程实现黄金分割法黄金分割法也叫0.618法,属于区间收缩方法。
首先找出包含极小点的初始搜索区间,然后按黄金分割点通过对函数值的比较不断缩小搜索区间。
当然,要保证极小点始终在搜索区间内,当区间长度小到精度范围之内时,可以粗略地认为区间中点为极小点的近似值。
黄金分割法适用于单谷函数,即在某一区间中存在唯一极小点的函数。
f (x )O a 1 x * b 1 x一、单谷函数及其性质定义1设单变量函数f(x)在区间a 1,b 1内存在唯一的极小点x ∗,x ∗∈a 1,b 1,且f(x)在x ∗点的左侧严格下降,在x ∗点的右侧严格上升,则称f(x)在区间a 1,b 1上是单谷函数或者下单峰函数,a 1,b 1为f(x)的单谷区间,见图1。
图1 单谷区间与单谷函数单谷函数具有一个重要的消去性质(I) 若f(a) < f(b), x *∈[a1,b]f(x)xa 1b 1(I) 消去[b, b 1]x *b a (II )若f(a)≥f(b),x *∈[a,b 1]f(x)xa 1b 1(II) 消去[a 1, a ]x *a b单谷区间与单谷函数有如下性质:若f(x)是单谷区间a1,b1上的单谷函数,极小点为x∗,在a1,b1任取两点a和b,且a<b,计算这两点的函数值f(a)和f(b),则:(1)当f a<f(b)时,x∗∈a1,b。
(2)当f a≥f(b)时,x∗∈a,b1。
由单谷函数的性质可知:➢在单谷区间a1,b1内任取两点a和b都可以求得一个相对更小的单谷区间。
➢这个过程可以一直重复下去,如果某个单谷区间的长度足够小,该区间的中点就可以作为极小点的近似。
二、黄金分割法的基本原理设计思路:反复使用单谷函数的消去性质,不断缩小包含极小点的搜索区间,直到满足精度为止。
设计原则:(1)迭代公式简单;(2)消去效率高;(3)对称性:a−a1=b1−b;(4)保持缩减比,即保留的区间长度与原区间长度之比保持不变。
黄金分割法及程序求解第5题:对函数f(x)=(x^2-1)^2+(x-1)^2+3,当给定搜索区-10≤x≤10使用黄金分割法求极小点α*。
解:显然,此时的a=-10,b=10。
首先插入两个点a1和a2,由黄金分割点法得:a1=b-γ(b-a)=10-0.618×(10-(-10))=-2.36a2=a+γ(b-a)=-10+0.618×20=2.36再计算相应插图点的函数值,得y1=f(a1)=35.171y2=f(a2)=25.731因为y1>y2,所以,消去区间〔-10,-2.36〕,则新的搜索区间〔a,b〕为〔-2.36,10〕。
第一次迭代:此时插入点a1=b-γ(b-a)=10-0.618×[10-(-2.36)]=2.362a2=a+γ(b-a)=-2.36+0.618×[10-(-2.36)]=5.279相应插入点的函数值为:y1=25.823y2=743.191由于y2>y1,同理,得新的搜索区间为〔-2.36,5.279〕.如此继续迭代下去,列出前六次迭代的结果:y2迭代序号a a1a2b y1比较0-10-2.36 2.361035.171>25.7311-2.36 2.362 5.2791025.832<743.1912-2.360.558 2.361 5.279 3.669<25.7773-2.36-0.5570.558 2.361 5.900> 3.6694-0.5570.558 1.246 2.361 3.669> 3.36650.558 1.247 1.443 2.361 3.369< 4.36860.5580.896 1.105 1.443假定,经过前六次迭代后已满足收敛精度要求,则得α*=(a+b)/2=(0.558+1.443)/2=1.0005相应的函数极值:f(α*)=3.000001运用MATLB程序求解:建立m文件:function[x,minf]=minHJ(f,a,b,k) format long;if nargin==3eps=0.000001;enda1=b-0.618*(b-a);a2=a+0.618*(b-a);k=1;tol=b-a;while tol>eps&&k<100000fa1=subs(f,findsym(f),a1);fa2=subs(f,findsym(f),a2);if fa1>fa2a=a1;a1=a2;a2=a+0.618*(b-a);else b=a2;a2=a1;a1=b-0.618*(b-a);endk=k+1;tol=abs(b-a);endif k==100000disp('找不到最小值');x=NaN;minf=NaN;return;endkx=(a+b)/2minf=subs(f,findsym(f),x)format short函数文件:syms x;f=(x^2-1)^2+(x-1)^2+3;[x,minf]=minHJ(f,-10,10);运行结果:k=36k=36x=1.000004289112507 minf=3.000000000091983。
%%%%%%%%%%%%%%%%%%%%%%%%%%-----进退法求合适区间-------%%%%%%%%%%%%%%%%%%%%%%%%%%%%%clear;syms x; %创建一个符号变量h=diff(f(x),x); %求对x的一阶导数x0=10;g=subs(h,x0); %在x0处h的值%%%%%%%%---------初始值在极小值点左侧的时候-------%%%%%%%%%%%%%%%%%%%%%%%%%%%%%if g<0step=10;x1=x0+step;if f(x1)<=f(x0)step=2*step;x2=x1+step;while f(x1)>f(x2)x0=x1;x1=x2;step=2*step;x2=x1+step;endelsestep=0.5*step;x2=x1-step;while f(x0)>f(x2)x0=x0+0.5*step;x2=x2+step;endenda=x0;b=x2;disp(['f(x)极小值点所在区间为(',num2str(a),',',num2str(b),')']);end%%%%%%%%%%%%%%%%%%%%当极小值点在初始点右侧时%%%%%%%%%%%if g>0step=6;x1=x0-step;%以下方法仅仅适用于初始值在极小值点右侧的时候if f(x1)<=f(x0)step=2*step;x2=x1-step;while f(x1)>f(x2)x0=x1;x1=x2;step=2*step;x2=x1-step;endstep=0.5*step;x2=x1+step;while f(x0)>f(x2)x0=x0-0.5*step;x2=x2-step;endenda=x2;b=x0;disp(['f(x)极小值点所在区间为(',num2str(a),',',num2str(b),')']);end%%%%%%%%%%%%%%%%%%%%----------当极小值点就是初始点时---------------%%%%%%%%%%%if g==0xm=x0;fm=f(x0);disp(['使用黄金分割法可得到f(x)在xm=',num2str(xm),'处取最小值fm=',num2str(fm)]);end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-----黄金分割法求极值-------%%%%%%%%%%%%%%%%%%%%%%%%%%%%%e=10^(-6);x2=a+0.618*(b-a);f2=f(x2);x1=a+0.382*(b-a);f1=f(x1);while abs(b-a)>eif f1<f2b=x2;x2=x1;f2=f1;x1=a+0.382*(b-a);f1=f(x1);else if f1==f2a=x1;b=x2;x2=a+0.618*(b-a);f2=f(x2);x1=a+0.382*(b-a);f1=f(x1);elsea=x1;x1=x2;f1=f2;x2=a+0.618*(b-a);f2=f(x2);endendxm=0.5*(b+a);fm=f(xm);disp(['使用黄金分割法可得到f(x)在xm=',num2str(xm),'处取最小值fm=',num2str(fm)]);自定义函数程序为:function y=f(x)y=3*x^2+2*x+5;%y=10*x^2+15*x+7;运行结果为:f(x)极小值点所在区间为(-8,10)使用黄金分割法可得到f(x)在xm=-0.33334处取最小值fm=4.6667。
优化算法之黄金分割算法-Matlab黄金分割算法适用于一元函数f(x)在给定区间[a, b]内搜索极小点的问题。
其基本原理为: 按照黄金分割比例原则逐步缩小搜索区间, 可类比二分法, 二分法是取a和b的中点逐渐缩小搜索空间, 而黄金分割算法是取a和b的黄金分割点。
一、Matlab脚本文件在此文件进行相应修改,然后运行即可。
% 1.设置要求的目标函数和搜索区间syms x; %定义x为自变量y = (x-1)^2 + 1; %要求的目标函数a = 0.1;b = 2; %a,b为搜索区间epsilon = 1e-3; %epsilon为收敛精度% 2.调用黄金分割算法函数求解[best_x, best_y] = golddiv(y, x, a, b,epsilon)二、黄金分割算法的函数文件function [best_x, best_y] = golddiv(y, x,a, b, epsilon)% 本函数实现黄金分割算法% y是目标函数, x是自变量, a,b为区间范围, epsilon为精度% best_x为黄金分割算法找到的最优点% best_y为最优点处的函数值if nargin == 4 %如果输入参数没有精度要求epsilon=0.001; %设置默认的epsilonendx1 = a + 0.382 * (b - a); %根据黄金分割比例确定搜索点f1 = subs(y, x, x1); %函数y在x1处的值x2 = a + 0.618 * (b - a); %根据黄金分割比例确定搜索点f2 = subs(y, x, x2); %函数y在x2处的值while(abs(b - a) > epsilon)if f1 < f2="">b = x2; %b为新的右边界x2 = x1; %更新x2值f2 = f1;x1 = a + 0.382 * (b - a); %更新x1值f1 = subs(y, x, x1);elsea = x1;x1 = x2;f1 = f2;x2 = a + 0.618 * (b - a);f2 = subs(y, x, x2);endendbest_x = (a + b) / 2; %最优的x值取a 和b的平均值best_y = subs(y, x, best_x); %最优的函数值end。