python解决最优化问题_python实现最优化算法

二分法

函数详见rres,此代码使该算法运行了两次

def asdf(x):

rres=8*x**3-2*x**2-7*x+3

return rres

i=2

left=0

right=1

while i>0 :

i = i-1

ans = 0.1

mid1 = (left + right + ans) / 2

mid2 = (left + right - ans) / 2

a=asdf(mid1)

c=asdf(mid2)

if a > c :

right = mid1

else :

left = mid2

b=(left+right) / 2

print("左极限=%s,右极限=%s,极小值x=%s"%(left,right,b))

左极限=0.45,右极限=0.775,极小值x=0.6125

收获: 这是我第一个实现的代码。学习完该算法以后,逻辑框架基本上就有了,剩下需要明确的就是对应的python的语言。于是我就开始了查找“如何定义函数”(详见mofan的优酷),“循环体”和“if条件语句”的格式(https://blog.csdn.net/qq_39407518/article/details/79822498)“数学符号”(详见mofan的优酷),以及print的使用

1.def是python中指定义,一般用来定义函数,如果需要深度学习搭建网络可用来定义网络。值得注意的一点是return必须要加在函数后面另起一行。

我不清楚为什么,但是如果没有加的话,那个函数公式就是一个花瓶,就像一个结果输不出去。

2.最坑的就是逻辑。一开始逻辑没理清楚,或者说在代码上有疏漏,导致我将left和right放在了循环体里,结果可想而知。不过也是因为这个错误,我知道pycharm中的debug怎么用,挺简单的,百度一下就出来了。

3.不知道什么原因,看的莫烦视频中的print多个变量一起输出是没有办法在我的pycharm中使用的,出来的结果很奇怪。可能是因为我是win10不是ios吧。print如果多个变量一起输出必须是print("名字:%s,名字2:%s"%(a,b))结果输出就是名字:a ,名字2:b

问题:1.为什么要加return?return的意思是输出这个def里面任意一个变量值作为结果显示。一般情况而言,是输出函数的关系式的命名,这样当你调用这个函数的时候,变量对应的函数值才能显示出来,否则只运行没有结果,不会有效果。

格点法——三点等分法

import numpy as np

def qwer(x):

third = np.exp(x) - 5*x

return third

left = 1

right = 2

mid1 =float(left+right) / 2

mid2 = (left+mid1) / 2

mid3 = (mid1+right) /2

a = qwer(mid1)

b = qwer(mid2)

c = qwer(mid3)

i = 5

while i > 0:

i=i-1

if a > b:

if c > b :

#b

right = mid1

mid1 = mid2

a=b

mid2 = (left + mid1) / 2

mid3 = (mid1 + right) / 2

b = qwer(mid2)

c = qwer(mid3)

else:#b>c

#c

left = mid1

mid1 = mid3

a = c

mid2 = (left + mid1) / 2

mid3 = (mid1 + right) / 2

b = qwer(mid2)

c = qwer(mid3)

else:#b>a

if a > c:

#C

left = mid1

mid1 = mid3

a = c

mid2 = (left + mid1) / 2

mid3 = (mid1 + right) / 2

b = qwer(mid2)

c = qwer(mid3)

else:#b>a&c>a

# a

left = mid2

right = mid3

mid2 = (left + mid1) / 2

mid3 = (mid1 + right) / 2

b = qwer(mid2)

c = qwer(mid3)

print("最小值=%s"%mid1)

print("函数值=%s"%a)

最小值=1.609375

函数值=-3.047189552275773

关于python中数据变量。第一遍运行结果出现很明显不对,于是我采用了debug。结果发现,mid1处一直为1而不是1.5,于是就开始了解数据变量。起初我猜测python默认所有变量为整型,但是根据二分法的结果我意识到此猜测不对,所以要改整个file的变量格式没有必要。所以我就在mid1式子前面加了一个float,结果就显示为1.5了。但是如果我将整个式子用()括起来,前面加float,结果还是1。我不太理解为什么。不过我知道了python的数据格式是根据输入量决定的,也就是说你的输入量如果是整型,那么与其直接相关的计算输出结果一定是整型,而且还是不采用进位的整型。在我没有采用+float/+.0这两种方法之前,mid1~3全部是整型。

left = 1.0

right = 2.0

mid1 =(left+right) / 2

或者不再mid1前面加float,直接将输入量后面点个点就行 真的很想吐槽一下print,好麻烦啊啊啊啊每次都得弄个%s,而且有时候还不能放一起!!!!

Fibonacci法

def fibonacci(n):

i=0

a = 0

b = 1

for i in range(n):

i=i+1

c = a+b

a = b

b = c

return c

def bn(x):

ert = x**2 - 6*x + 2

return ert

z = 2

p = 0

left = 0.00000

right = 10.00000

L1 = right - left

while z < 100:

m = fibonacci(z)

l = L1/m

k = 1.000/m

if k < 0.03:

print("n=%s,Fn=%s"%(z,m))

L2 = l*fibonacci(z-1)

t = left + L2

r = right -L2

while p < 3:

p = p + 1

l3 = t - r

e= bn(t)

o = bn(r)

if e>o :

right = t

t = r

r = left + l3

else:#o>e

left = r

r = t

t = right - l3

break

else:

z = z + 1

okk=(left+right)/2

okky=bn(okk)

print(left)

print(right)

print("极小值x=",okk)

print("极小值y=",okky)

不要问我掌握了什么,要问我现在写完这个代码后有多么的爱python的精度表示 :-)我决定以后只要再编写数学公式的代码都将输入量的小数学点后面补很多0 fibonacci函数定义,每次debug后我的手都是抖的O(∩_∩)O~

黄金分割法

def gold(x):

gg= x**2 - 6*x + 9

return gg

left = 1

right = 7

ans = 0.4

a = left + 0.618 * (right - left)

b = left + 0.382*(right - left)

gga = gold(a)

ggb = gold(b)

i = 0

while i < 7:

print("i=%s" % i)

print("left=%s,right=%s" % (left, right))

print("x左=%s,x右=%s" % (a, b))

print("y左=%s,y右=%s" % (ggb, gga))

c = right - left

if c > 0.4:

i = i + 1

if gga > ggb:

right = a

a = b

b = left + 0.382*(right - left)

gga = ggb

ggb = gold(b)

else:#gga

left = b

b = a

a = left + 0.618 * (right - left)

ggb = gga

gga = gold(a)

else:

break

不知道自己什么时候有的强迫症,只要是代码下面有“~”我就必须要消掉。笑哭。这个很简单,前四个除了费波纳茨,都很简单。

间接法——二次插值法

def yy(x):

y=x**4-4*x**3-6*x**2-16*x+4

return y

def xing(xm1,xm2,xm3,fm1,fm2,fm3):

yxxx=0.5000*((xm2**2-xm3**2)*fm1+(xm3**2-xm1**2)*fm2+(xm1**2-xm2**2)*fm3)/((xm2-xm3)*fm1+(xm3-xm1)*fm2+(xm1-xm2)*fm3)

return yxxx

x1 = -1.0000

f1 = yy(x1)

x3 = 6

f3 = yy(x3)

x2 = 0.50000*(x1+x3)

f2 = yy(x2)

xp = xing(x1,x2,x3,f1,f2,f3)

fp = yy(xp)

a = abs(xp-x2)

while abs(xp-x2) > 0.05000:

a = abs(xp - x2)

if xp > x2:

if fp > f2:

x3=xp

f3=fp

xp = xing(x1, x2, x3, f1, f2, f3)

fp = yy(xp)

print("ans=%s" % a)

print("left=%s,right=%s" % (x1, x3))

print("x*=%s,fp*=%s" % (xp, fp))

print("x2=%s,f2=%s" % (x2, f2))

print("******************")

else:#f2>fp

x1 = x2

f1 = f2

x2 = xp

f2 = fp

xp = xing(x1, x2, x3, f1, f2, f3)

fp = yy(xp)

print("ans=%s" % a)

print("left=%s,right=%s" % (x1, x3))

print("x*=%s,fp*=%s" % (xp, fp))

print("x2=%s,f2=%s" % (x2, f2))

print("******************")

else:#xp

if fp > f2:

x1 = xp

f1 = fp

xp = xing(x1, x2, x3, f1, f2, f3)

fp = yy(xp)

print("ans=%s" % a)

print("left=%s,right=%s" % (x1, x3))

print("x*=%s,fp*=%s" % (xp, fp))

print("x2=%s,f2=%s" % (x2, f2))

print("******************")

else:

x3 = x2

f3 = f2

x2 = xp

f2 = fp

xp = xing(x1, x2, x3, f1, f2, f3)

fp = yy(xp)

print("ans=%s" % a)

print("left=%s,right=%s" % (x1, x3))

print("x*=%s,fp*=%s" % (xp, fp))

print("x2=%s,f2=%s" % (x2, f2))

print("******************")

这个公式看起来很麻烦,书写的时候更要谨慎。我上回把那个2搁在了分号下面,结果很大,所以还是换算成0.5更好(PS:勿忘那长河般的0)。 虽然代码很长,但是主要是因为print太多。本打算在开头print,最后结果会漏掉最后一部分。懒得想其他办法了,直接就这样吧

间接法——牛顿法

def fd(x):

y = 4*x**3-12*x**2-12*x-16

return y

def fdd(x):

ys = 12*x**2-24*x-12

return ys

i = 1

x0 = 3.00000

ans = 0.001

while i < 7:

fd0 = fd(x0)

fdd0 = fdd(x0)

if abs(fd0) > ans:

x1 = x0 - (fd0/fdd0)

x0 = x1

print("次数:%s,所得的值x:%s"%(i,x1))

i = i + 1

else:#fd0<0.001

print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")

print("Bingo!顺利通关!祝您开学愉快!")

print("Boss X=%s"%x0)

break

一开始while里面,导致run不出来。继而,debug也没法用。在网上一查才知道 “没联网”+“没选断点”。最后想尝试将else里面的内容输出来,结果发现run以后被刷屏了。于是改成i<7以后还是不行,于是想着加一个break跳出循环,结果成效了。 然后刚刚由debug了一下,才知道原来是i+1在if里面,因为没有办法+1,所以i=6一直存在,就不断循环。因为加break也好,i+1也好,都可以。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么需要包装类?

1、某些方法的参数必须是对象&#xff0c;为了让基本数据类型的数据能作为参数&#xff0c;提供包装类。 2、包装类还可以提供更多的功能 3、其他特别重要的功能&#xff1a;比如可以实现字符串和基本数据类型之间的转换 认识一下包装类吧&#xff01; package demo05;impor…

python自动计算多个教学班的优秀率_第二个月课堂009python之总结(002)

python7天的总结------------------------------------------------------------------------------------------------评价&#xff1a;1、函数 def 自定义行数和内建函数2、re模块3、python3和python的去别4、字典&#xff0c;元组&#xff0c;列表&#xff0c;元组&#xf…

一句话概括自动装箱/拆箱

自动装箱过程是通过调用包装类的valueOf&#xff08;&#xff09;方法实现的&#xff0c;二自动拆箱过程是通过调用包装类的xxxValue&#xff08;&#xff09;方法实现的&#xff08;xxx代表对应的基本数据类型&#xff0c;如intValue&#xff0c;doubleValue等&#xff09;。 …

python loop call soon_python3-asyncio 学习笔记 1 -- call_soon

最近在学习python3 的 asyncio, 特将学习笔记记录于此.先来个简单的例子:import asynciodef hello_world(loop):print(Hello World)loop.stop()loop asyncio.get_event_loop()# Schedule a call to hello_world()loop.call_soon(hello_world, loop)# Blocking call interrupte…

2021-05-24

String类的使用 package demo07;import java.util.Locale; import java.util.function.BiConsumer;public class TestString {public static void main(String[] args) {//1.创建一个String对象String str "abcDEfghijkL";//2.操作该String对象//2.1最简单的方法Sy…

StringBuffer和StringBuild

StringBuffer和StringBuild两个类的区别主要是&#xff1a; StringBuffer JDK1.0提供的类&#xff0c;线程安全&#xff0c;做线程同步检查&#xff0c;效率较低。 StringBuild JDK1.5提供的类&#xff0c;线程不安全&#xff0c;不做线程同步检查&#xff0c;因此效率较高。…

python背单词游戏_Python基础-背单词游戏

Hangman直译为“吊死鬼”&#xff0c;是一个猜单词的双人游戏。由一个玩家想出一个单词或短语&#xff0c;另一个玩家猜该单词或短语中的每一个字母。第一个人抽走单词或短语&#xff0c;只留下相应数量的空白与下划线。想字的玩家一般会画一个绞刑架&#xff0c;当猜字的玩家猜…

Date类练习

package demo09;import java.util.Date;public class TestDate {public static void main(String[] args) {//获取当前时间Date now new Date();//输出当前时间System.out.println(now.toString());System.out.println(now.toLocaleString());System.out.println(now.getYear(…

全连接层的作用_python构建计算图2——全连接层

&#xff08;好久不更~&#xff09;前文中&#xff0c;参照tensorflow的方式实现了简单的自动求导。接下来要在自动求导的基底&#xff08;模板&#xff09;上搭建简单的bp神经网络。计算图前文曾多次提到计算图&#xff0c;关于什么是计算图&#xff0c;有很多种说法。既然它被…

DateFormat类

DateFormat是一个抽象类&#xff0c;一般使用它的子类SimpleDateFormat类来实现。主要作用就是把时间队形转化成指定格式的字符串 反之&#xff0c;把指定格式的字符串转化成时间对象。 package demo10;import java.text.DateFormat; import java.text.ParseException; impor…

pythonocc 扩展数据_如何在pythonOCC中使用样条函数?

您只需将代码修改为C(而不是C)BOOST_PYTHON_MODULE(Spline){import_array();boost::python::numeric::array::set_module_and_type("numpy", "ndarray");class_("Spline", init<>()).def("spline", &Spline::spline);}因此在…

免费CDN:jsDeliver+Github使用方法

免费CDN&#xff1a;jsDeliverGithub使用方法 CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。CDN是构建在网络之上的内容分发网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发、调度等功能模块&#xff0c;使用户…

python 电脑显示桌面_使用Python快速实现显示器关闭和锁住桌面

现在很多公司都需要考虑节能&#xff0c;特别对电方面的节能。因此很多公司都针对电脑进行管理&#xff0c;比如当你离开电脑时&#xff0c;需要把显示器处于关闭状态&#xff0c;同时让电脑处于锁定状态&#xff0c;这样有利于节能&#xff0c;同时也能延长电脑显示器的寿命&a…

教你如何使用github+jsDelivr搭建免费图床

前言 之前写了一篇文章&#xff0c;教你如何使用TyporaPicGo实现图片自动上传到图床 。 这里我用的是七牛图床&#xff0c;七牛图床有一定的免费使用量&#xff08;没记错的话应该是10个G&#xff09;&#xff0c;如果你的存储量超过这个大小就需要付费使用了。除此之外&…

python extract的使用_Python extract及contains方法代码实例

一&#xff0c;extract方法的使用extract函数主要是对于数据进行提取。场景一般对于DataFrame中的一列中的数据进行提取的场合比较多。例如一列中包含了很长的字段&#xff0c;我们希望在这些字段中提取出我们想要的字段时&#xff0c;就可以通过extract方法进行数据的提取了。…

hexo-Fluid主题使用手册

hexo-Fluid主题使用手册 [官网] https://fluid-dev.github.io/hexo-fluid-docs/ 前言 Fluid 是一款很十分优雅的主题&#xff0c;那么写一篇优雅的文章搭配它呢&#xff1f;以下会从几个方面来简述&#xff0c;主要还是做几个推荐。 文章内容 熟悉 Markdown 语法 对于使…

怎么用python做战斗机_关于python文件操作

总是记不住API。昨晚写的时候用到了这些&#xff0c;但是没记住&#xff0c;于是就索性整理一下吧&#xff1a;python中对文件、文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块。得到当前工作目录&#xff0c;即当前Python脚本工作的目录路径: os.getcwd()返回指定目…

Hexo-fluid主题设置统计博客阅读量

Hexo-fluid主题设置统计博客阅读量 开始小插曲&#xff1a; 我使用的是sublime文本编辑器&#xff1a; [官网] https://www.sublimetext.com/ 正戏开始 查找关键字&#xff1a;web_analytics (快捷键ctrlF) 这里我使用一个第三方服务Leancloud来统计文章的阅读量。 首先…

使用Hexo写博客

尽管 Hexo 支持 MarkDown&#xff0c;但是我们却不能像写单独的 MarkDown 文档时那样肆无忌惮。由于我们所写的文档是需要被解析为静态网页文件的&#xff0c;所以我们必须严格遵从 Hexo 的规范&#xff0c;这样才能解析出条理清晰的静态网页文件。新建文档 假设我们的文章名为…

mysql过滤效率和java过滤效率_如何合理选择初中高效过滤器的效率?

利菲尔特环保科技点击蓝字 关注我们 各种型号的空气过滤器有不同的标准和使用效率&#xff0c;今天利菲尔特为您介绍各种类型的空气过滤器在不同地方的应用。一般情况下&#xff0c;最末一级过滤器决定空气净化的程度&#xff0c;上游的各级过滤器只起保护作用&…