python解线性方程组
㈠ python解决jacob迭代法求解线性方程组
题主好. 经典的 Jacobi 迭代算法如下:
设 A = D - E, 则 x = D^{-1}*b + D^{-1}*E*x = C + T*x
可以参考如下代码(复制代码后请注意缩进):
import numpy as np
def linalg_solve_jacobi(A, b, x0, max_it, tol=1.0e-7):
# 判断 A, b 的维数是否正确
if A.shape[0]!=A.shape[1] or A.shape[0]!= b.shape[0]:
raise Exception('A must be square or A and b must be compatible!')
D = np.diag(A)
# 判断对角元素是否含零
if np.amin(np.absolute(D)) < 1e-14:
raise Exception('Diagonal elements of A must not be zeros!')
# 设置初始迭代步数为0
n = 0
#
# Jacobi 算法:
# 设 A = D - E, 则 x = D^{-1}*b + D^{-1}*E*x = C + T*x
#
invD = np.diag(1.0/D) # invD is inv(D)
C = np.dot(invD,b) # C is inv(D)*b
T = np.dot(invD, np.diag(D)-A) # T is inv(D)*E
while n < max_it:
x = C + np.dot(T, x0)
if np.linalg.norm(x-x0)<tol:
break
x0[:] = x
n+=1
# 如果超过最大迭代步数, 迭代失败
if n>max_it:
raise Exception('Failed to converge within {} steps!'.format(max_it))
# 成功, 返回
return x, n
if __name__ == "__main__":
A = np.array([[10, -1, 2, 0],[-1, 11, -1, 3],
[2, -1, 10, -1], [0, 3, -1, 8]], dtype=np.float64)
b = np.array([6, 25, -11, 15], dtype=np.float64)
x0 = np.array([0,0,0,0], dtype=np.float64)
max_it = 100
tol = 1.0e-7
x,n=linalg_solve_jacobi(A, b, x0, max_it, tol)
print(x,n)
㈡ App Store上有哪些冷门但逆天的 App
App Store 应用商店中有不少的应用APP,很多其实比我们常用的一些软件还好用,只是因为某些原因导致名气不大,不被大家熟知而已。而且一些都是一些素人开发者开发出来的,所以说在功能方面更加的贴合我们的生活,那么有哪些在在苹果APP Store上冷门却逆天的应用呢?
1、MathStudio(强大无敌)
这是一个致力于数学计算的工具,冷门至极毕竟没有那么多的学霸会喜欢用来搞什么数学计算研究一类的,而使用的基本上都是真正的内行人。所以自然冷门十足,但是却不可小看它,这个APP实力可谓是强大无比,对于简单的四则运算和什么函数、指数、对数、开方等运算都可以计算,更厉害的是有很多的高级的运算。
像高数中求极限、导数、多元函数的偏导数、算不定积分、画函数图像、方程图像更是小意思了。反正你高数上能用到的图像、公式基本上都能用它搞出来,最恐怖的是竟然自带一个编程环境,让人不得不怀疑这是哪个学霸研发出来的。
而且别看这么逆天的功能存在,它的内存超乎你想象,不要998只要区区4M左右就完成了,当然,这个 App 肯定有缺点就是价格有点贵好像两百多还是多少,不过绝对的物超所值!
2、Stellarium(虚拟天文馆)
这款软件适合那些对天文学抱有很大兴趣的朋友,当然你要是为了装装高内涵也可以。因为你有理他可以看你想看到的星星,还能知道是什么 星座 的星星, 对着天空,你往哪里摆,app上的星象图也会跟着动。这是一款十足的观星神器,只是用的人少打分更少。
3、 开眼
平时你看的很多短视频都是很庸俗们什么营养的,但是只要你下载了这款软件就可以避免再刷到那么多的奇葩。你只要用了这款软件绝对能学到 不少干货,而且这里 绝对没有很多无聊的东西,有的都是一些十分有用的东西,真正的让你做到开眼看世界。因为没有什么乱七糟八的东西,自然省却了我们不少的时间,对于想要学的人来说这是绝对纯净的软件。
4. 国家地理
对于那些想要 探索 其他国家神秘美景事件的人来说这是一个不容错过的软件,它的名字可能你曾经听说过。没错就是那个国家地理杂志,人家可是出了这款APP的,里面都是各地高清的图集、图片,让你一览各地的名胜古迹,云 旅游 绝对爽!
5、Pythonista
这是一个强大的Python编辑器,不过想要完全的掌握好它就需要懂得一定的Python运作。若只从编辑器的角度来看,它无疑很优秀。支持多种颜色主题,强大的小键盘,输入联想,还内置了无数强悍的Python模块。而且他的厉害之处在于在懂的人手里直接变成一款神器,可以用来处理执行各种的脚本数据还可以建模、建动画、做个时钟等等,还可以做小 游戏 来玩,堪称强大。
6、好奇心日报
它绝对是新闻阅读类APP中的一股清流,没有博眼球的震惊派标题党,也没有密密麻麻的小广告,界面干干净净,看起来十分的舒服。除了简洁到性冷淡的界面,最吸引人的是它优质的内容,涉及到商业、 娱乐 、艺术、 科技 、 时尚 等各个方面,有新鲜独特的资讯,也有深刻的分析报道。
另外它还有特别有意思的栏目,比如:浮华日报、这世界、为什么读书等等,总之它的内容可以用高逼格、有深度、涨姿势来形容,早上起来上去刷一刷已经成了我的习惯了。
7、幕布
这是一个帮助你整理思路的一个想法工具,对于你做计划还是什么写文章、记录想法等都可以使用,它能将你的想法以结构框架的形式来展示出来,像思维导图一样,将重点整理清楚、条理疏理完善,对于你理清逻辑,整理思路,都有很大的帮助。更加厉害的是这款软件还能够支持PC端和手机端的同步,既可以在手机上编辑,又可以在电脑上码字,非常便利。
8、潮汐
很灵性的一款软件的软件,当你想要做事情想轻松愉快的进行却又不想听歌的时候,就可以选择他来陪伴你。它的内置功能就是通过那些自然界清脆、轻盈的声音像:白噪音、海浪、鸟叫、下雨声等既不让你感觉冷清,又能让你集中精神。另外还可以帮助我们进入睡眠,夜晚睡觉的时候借助那些自然界轻缓的声音帮助你快速入睡,第二天也可以将你轻柔的唤醒。另外,App会每天自动生成一张高清壁纸和一句名言,每当打开App看到这些句子和壁纸,都很惊喜。希望新的一年,它也能帮助你更专注地工作。
9、蜗牛睡眠
一些人总是因为各种各样的原因导致熬夜晚睡,时间一长就导致了睡眠质量大跌,而这个软件就是一个很不错的帮助我们睡眠的APP。他的厉害之处就在于记录你的深睡时间、浅睡时间、做梦时间、环境噪音,进而给出睡眠质量打分,让你可以依据这些数据,改善你的睡眠状况。
还有神奇的功能就是能够记录夜晚睡觉的鼾声和梦话,这样你的朋友在打鼾、说梦话的时候你就有证据了,到时候给他听听那情景肯定很美妙。
10、千与千寻
名字就很特别相信很多人都知道。这也是一款神奇的软件,因为这里可以看到别人的聊天记录,这可是一个很有意思的操作,还能选择不公开。这样一来对于那些情商有待提高的朋友,可以借鉴聊骚达人的先进经验,也可以看看感兴趣的妹子,不用聊天就能迅速了解一个人这你还不可吗?因为毕竟使用的人数少,不像国内的那些软件那样多,所以相对比较的冷门。即便啥也不干,当个树洞也不错啊!
好了今天给大家分享的就是这几类APP,觉得实用的话大家可以去试试哦!
无锡创元传媒:四夕
这9款冷门但逆天的APP真的绝了!强烈安利!!
1、桌面时钟(iOS/Android)一个主题非常丰富的手机桌面时钟,功能极简,打开就是一个时钟,但是里面的时钟主题非常丰富,比如我最爱的生辰钟、太空表盘时钟、 科技 馆十足的辉光管时钟,用起来不仅颜值高而且提升专注力!
超级有灵气的短句子APP,整体风格太简约治愈了!里面的句子不仅治愈心理的不开心也适合喜欢发朋友圈和早安晚安语录的朋友,模板超级好看!
这是一款可以制作壁纸和桌面美化的万能小组件APP,制作的壁纸简直太赞了有个性了!桌面小组件我最喜欢太空人和每日提醒TODO-list,放桌面真的超方便。
记录每日心情,这款微手帐APP是让我爱上电子手帐的原因,简直是太方便了!里面不仅有各式各样的免费素材贴纸,还有很多信纸、背景图,还可以插入照片,更好地记录生活。
对于看完电影习惯写一些影评发个朋友圈,但又不想拍电影票,想高逼格点。这款App,可以说是便利直通车。 App里不仅能找到很多精美的海报,还能直接看到豆瓣影评。 现在我想看电影都是直接在这上面搜索,看完电影的介绍点评再决定是否要去看这部电影。
这个APP集合了 免费、书多、读书体验好 这三个,每天会有一个小时的免费阅读时间,超过了才要收费,一小时的读书时间对我来说是完全够的,久而久之我也养成了每天读一小时书的习惯。而且里面的书非常多,想看的基本都能找得到,官方还会根据阅读习惯推荐用户一些优质的书单。
一个完全免费的日语五十音学习软件,它支持多种学习模式,平假名转换成片假名、片假名转换成平假名、听写模式、复习模式、测试模式、拗音查阅。
Mars围绕城市中的商圈,推荐那些非常值得去的餐厅、酒店、酒吧、家居店铺、书店、艺术展览,总之是当地人经常消遣时光的好地方。而且这些地方都是当地的编辑们亲自考察的,每一个都值得去。
我来说一说我的手机里有些什么特别厉害的软件。
1,捷径,如果说iOS 12有什么特别厉害的软件那么捷径绝对是其中最厉害的一个。捷径就像是最早的按键精灵一样,然后由于开放了软件的API接口,所以捷径的功能及其强大。你可以轻易的实现一些特别的功能,比如网盘万能钥匙,一键下载YouTube视频,无损音乐下载。而且你可以轻易的,或许别人制作的规则。无限扩展捷径的功能。
2,Gpsfake,这是一个可以修改你定位的工具。如果你受够了钉钉打卡的折磨,这个工具可以帮助你。
3,Procam6,这是一个非常专业的相机软件。让你的iOS设备跟单反一样可以调节iSO,快门,白平衡等设置,甚至他还可以超频你的摄像头。让你的视频分辨率远超过官方的分辨率。
4,谷歌地球,这是一个让你不出家门,就能够游览全世界的工具。
5,奥维互动地图。这是一个能够精确读取那个经纬度的地图,我一般在找无人机的时候就会利用到他。
6,Videoleap,这可能是IOS 上最好用的编辑软件了。
7,nPlayer ,这可能是iOS上格式支持最多的视频播放软件,而且支持局域网播放。
iSoul
iSoul 是一个iPhone 防盗助手App。
使用它可以防止你的iPhone 手机丢失,防盗。
它有很多模式,你可以随时设置。比如桌面模式,离开桌面就会发出警报。
还有飞行模式(飞行模式模式开启),口袋模式(拿出口袋),距离模式(超出距离)等等。
这些常用的模式,一旦触发,就会发出警报,不管是在做地铁公交,或者是公共场合,手机永远不会丢。
Workflow
用iPhone 的人,手机一个有一个App,那就是Workflow,如果没有,你的手机就白买了。
它和上面接收的IFTTT 类似,但是更接地气,更加使用与iOS 系统,比如你发送一个东西,从一个App 发送一个东西,扔给Workflow 就行了。想要将网页保存为图片或者PDF,它也能做。每天给你发送精美图片,帮你查天气预报天气,自己做一个翻译工具等等太多了。对它都可以的,更多大家可以去搜索,只要你脑洞足够大,Workflow 让你玩出很多花样。
而且最近它被苹果爸爸收购了,也看出它的优秀,以后再系统中集成,那功能就更强大了。我们拭目以待。
JSBox
JSBox 是一个具有JS 编程环境的iOS App。
使用它你可以随意编写自己的工具,只要你稍微懂点编程,JS 你就可以使用。
使用它可以查询天气,新拍的照片自动上传服务器等等,只要你脑洞够大,能写出更多不一样的东西。
而且它还有漂亮的编辑器,支持自动补全,主题切换,快速输入等功能。
同时还有iOS 原生接口供你使用。
搜狗听写
搜狗听写是一款实时语音转文字的App。
可以把它当做你的录音笔,使用它可以轻松写文章,笔记整理,采访录音等等。
而且它还能同时保留语音和文字,并且不限时长,录音的时候还可以添加重点标记。
同时它还多端同步,而且还可以在电脑浏览器中访问编辑。
还可以一键将内容分享给第三方平台。
悟空遥控器
悟空遥控器是一个智能电视 / 智能盒子 遥控器App。
只需要手机端和电视端安装之后,就可以使用手机遥控电视了,同时支持手势,方向键,鼠标,数字键,让你随心操作。
同时支持各大电视和盒子,全网电视随时播放,而且还可以投放网络云的资源哦,这个感觉很棒啊,私藏在网络云的小电影也可以一键播放。
同时内置高清直播,综艺,热门电视剧也不错过。
那今天就来做个iOS专场,专门来说说App Store上那些好用却不一定被大众熟知的小众APP。应用类型广泛、功能强大,建议先收藏~
一款设计简单、主打可爱风格的心情日记。可以用文字表情标记心情,也可以动手绘制属于自己的可爱微表情。支持图片上传,超多可爱的贴纸素材,让记录手帐成为更有趣又治愈的事。
一款由 Google 开发的照片编辑工具,提供29种工具和滤镜,可以局部修图,一件解决局部问题,也可以直接套用自带样式,滤镜非常多。总之,质感修图,用它!
一款集合了小组件、主题、壁纸的桌面美化工具,可制作抽屉式等个性化壁纸。小组件的主题也很丰富,有时钟、之前很火的太空表盘、倒计时、日历、to do list待办事项、语录、便签等等,小组件支持全透明效果。
一个功能非常强大的数学/高数学习软件,支持解决8类数学问题,100多个数学计算器,可以辅助解决大部分数学问题,提供详细的解题步骤,让数学学习从此无忧。
让手机充电拥有黑 科技 效果的苹果充电动画app,提供时下最热门酷炫的主题充电动画和提示音,让个性充电动画不再只是安卓的专利。玩机爱好者必备~
一款纯粹的网页浏览器,没有广告,没有推荐,界面十分简洁。内置AI引擎、网络、搜狗、谷歌搜索,包含作业学习、实习工作、翻译查询、高考查询、生活查询及各种AI黑 科技 ,功能相当强大。
清单式的笔记工具,无论是日常写作列提纲,还是整理学习工作笔记,用了它,逻辑条理、框架结构都不成问题。还可将文字内容提炼出核心观点,一键生成思维导图,懒癌患者必备!
一个分享打动人心事物的 App,每天都会推荐一首歌、一则语录、一篇文章,每天用十几分钟的细碎时光,点燃内心的光明。
以上就是推荐的全部内容,有需要的话可以安装体验一下~
想起自己用手机这么久,你说冷门比较逆天的APP或者说哪些脑洞极大的APP,还真是遇到过几个,闲着无聊就先写出来分享给各位好了:
1.B格满满的3D照片—Fyuse
Fyuse一直是在国外相对比较火的一款摄影软件,主打3D照片,可以让你用完全不同的角度去看你所拍的东西。别人只能展示简单的一面,但是你可以展示照片的360度
而且Fyuse有他自己的社交功能,日常就可以看到大佬们拍摄的奇思妙想,当然不建议大半夜的浏览,因为置顶的 美食 栏非常的丧心病狂。
像最近就开始了各种万圣节妆容什么的,可以说是资本主义真会玩系列。
新奇好玩的各种拍摄角度,完全可以满足360度想要呈现眼前场景的需求。
值得一提的是,这个APP拿来做一些产品展示的时候,可以展示到你想看到的每一个细节,之前做外贸行业的时候,给客户看用这个APP展示出来的产品,B格简直不要太高。
2.手残版P图软件—Photo Lab
这个APP可以说是B格拯救神器,完全可以拯救不会拍照星人和不会P图星人,一键Copy特效的功能简直让人感觉太他妈的逆天了
首页直接推荐比较好看的照片滤镜,然后会有原图展示,你只要把自己相册里和原图风格差不多的照片选中,然后选择使用这个风格。。
然后就自动帮你P成大片效果。你什么都不用管。。。
是的,就是这么智能,就是这么简单粗暴。。
3.强大的远程桌面工具—向日葵远程控制软件,控制手机和电脑这款APP是一个做设计的基友安利的,他是在家时远程修图。我觉得比较吸引我去用的是,它能适配各种系统来控制手机和电脑,用来把妹、哄老板、防小三那是扛扛的~
比如,学妹电脑有问题了,你一个手机过去就能远程帮她修理,对方惊喜之余就对你有好感了;随时远控公司的电脑,老大需要啥你都能立马处理,给他一个时时刻刻我都在待命着工作的勤奋印象,即使你可能已经在酒吧嗨的忘了家在哪里了;防小三,你懂的,直接控制他手机~呃~这种操作当我没说啊,最好的当然是用来控制父母手机,你远在外地工作也能远程教他们用智能手机。
桌面控制就是控制电脑或手机的桌面
摄像头,直接就是调用摄像头,可以当监控用。。。当你给小姐姐修电脑时,这个操作要小心。。。
远程文件,直接是手机与电脑之间上传或下载文件,相当于云盘了。
CMD,直接在上ping命令,运维工程师会用得到
同样的这个也非常适合各种 游戏 挂机党,担心自己的自动挂机是不是停了呀,或者是文明建造进度现在如何呀,牧场的庄稼是不是可以收了呀。
4. 可能是最逆天的 游戏 应用—S.M.T.H,中文名送我上西天。这个不是IOS系统中的 游戏 的主要原因是为了用户考虑。毕竟苹果这么贵,还是会挺心疼的。。
因为作为一款手机 游戏 应用,他可能会是最令人感到心跳加速的 游戏 应用。
但是内容十分简单,就是把手机扔上天
当然就会有朋友好奇的问,那要是没接住怎么办呢?
呵呵,你说呢?
这款 游戏 应用十分适合朋友聚会的时候大家一起掏出来比一比,毕竟这款 游戏 不单单逆天,他可以说是真正的你咋不上天级别的 游戏 了。
要说冷门并且逆天的 App,有一个特别符合要求:MathStudio:
这个 App 足够冷门:在 App Store 的中国区冷得都没有评论与打分。不过肯定算得上是逆天,下面说一下这个 App 为什么能称得上是逆天。
作为一个数学计算工具,那类似普通的 1+1 什么的四则运算表达式当然能做了,加减乘除、乘方、开方、指数、对数、(反)三角函数都可以计算:
当然,既然称之为逆天,那绝对不止只能算一些这样的表达式。还可以:
解方程:
求极限也是小意思了:
求导数,包括多元函数的偏导数:
除了能求导,还可以算不定积分与定积分:
画函数图像、方程图像更是小意思了。MathStudio可以画:
矩阵、行列式、线性方程组那些,比如计算矩阵的某个行列式、求逆矩阵、矩阵乘法、SVD 分解等等:
傅里叶展开:
概率论与数理统计那些,比如画正态分布曲线、求二项分布的 PDF (概率密度函数)和 CDF (概率累积函数):
自然语言处理:
这个 App 居然还带了一个编程环境:
解析 JSON:
元胞自动机:
要是有闲情逸致可以搞出个俄罗斯方块或者贪吃蛇:
除此之外的功能还有不少,在这里肯定不能一一介绍,可以移步在 MathStudio 官网的在线界面里查看:MathStudio。到这里,相信看官会认同这对得起“逆天”的称呼。这应该是 iOS 上最强大的数学工具了。
有人可能会想,这个和 WolframAlpha 相比怎么样?这个软件相对于 WolframAlpha 有个决定性的优点:
不用联网
嗯,不用像 WolframAlpha 那样要先把计算需求发送到服务器那边,等服务器算一阵子再拿到结果,而是输入完需要计算的项目后点 Solve,Plot 等立刻能得到结果。当然,可以离线用。
然后,这个 App 居然还提供了 Apple Watch 支持:
最后,你会想,这么一个功能逆天的 App 下载下来岂不要占一大块儿存储空间?要用一百多还是两百多 MB?
答案是:不到 4 MB。这基本就是一个中型、大型 App 的零头,甚至比某些 游戏 或 App 的单张贴图、切图还小。用 Wi-Fi 的话基本是秒下,就连用流量下载都不心疼。相比之下 WolframAlpha 要用二十多 MB。这样哪怕你用的是 16GB 版的 iPhone 都不会在意占用存储空间。
这个 App 有点儿年头了。至少我在 09、10 年上高中时,就在 iPod touch,iPhone OS 3.x 上用过了。那时还叫 SpaceTime,后来才改名为 MathStudio。在那时候功能就已经十分强大,和现在差不多了。
【删除】当然,这个 App 肯定有缺点。就是:
贵啊,两百多人民币。这大概就是其冷门的原因吧……【删除完】
-
好吧,我承认,高中用臭名昭着的 91 手机助手在 iPod touch 上装的这个。现在用的是在去年限免的时候下载的。这下你们相信我没在臭得瑟了吧……
确实价钱有些贵,不过如果有网络,可以用在线版的。
不多说,直接上APP!
Notability一款能实现无纸化笔记的APP,iPhone、iPad、macdo都能用。
可以导入课件/PPT,在上面做记录,可以自动备份和 iCloud 同步。
使用各种笔记、日记和绘图工具、例如墨水笔、荧光笔、文字和音频。
小睡眠一款能监测睡眠的APP,临睡前开启睡眠记录功能,会根据你晚上的睡眠情况,进行评估。
会给你提供睡眠改善建议,也能录下你晚上说过的梦话,或者鼾声。
可以设置第二天起床的闹铃,主打无痛唤醒,闹铃声舒缓,使用感特别好。
Anki一款功能强大的卡组背诵APP,会根据你的复习效果生成图表和统计数据。
界面简单,使用方便,但价格是真的高。目前也有不少平替的APP。
夜之森一款治愈系的养成 游戏 ,而且免费。喜欢猫咪,喜欢治愈 游戏 的宝,一定别错过!
游戏 里的猫咪会帮你寻找种子,猫咪每次外出都会给你带回不同的种子或者动物,你可以选择要培育的种子,还有培育植物的小动物,它们就会留下来啦~
MarginNote 3一款综合性的阅读笔记工具,集合了思维导图、卡组背诵,笔记记录等功能。
因为功能多,所以上手没这么简单,需要摸索。这款APP也是支持iPhone iPad Mac使用。
目前移动端和PC端的收费不统一,所以购买前需要了解清楚。
Hi,我是阿詹,这5款冷门实用的APP,后悔没早点知道,且听我慢慢道来!
一、掌阅精选
之前只知道掌阅,没想到还有这个APP,它专注于为用户提供精品书籍阅读服务,拥有搜索找书和专业分类找书功能,用户可以对感兴趣的书放入书架或者直接购买,最令人意外的就是如果对购买的书籍不满意,还可以在规定时间里进行退还,整体阅读界面也很舒服,推荐一下!
二、数蚁
一款效率工具,用这个APP可以随时随地的查看、管理使用以及分享工作资料,还可以安全的进行备份,即使外出了,也能轻松通过手机来进行沟通处理,重要的是它为你提供了2T的存储,以及15MB的高速访问,最后它对个人资料以及知识库都有水印保护,还是不错的。
三、幕布
简单的说,它是一款云端笔记,支持win、mac、安卓、ios,能做到信息全平台同步,但令人最为夸赞的是它能将笔记一键转换成思维导图,这其实有助于人们的办公和学习,同时APP遵循简约的风格,让人看起来很舒服!
四、echo回声
这个APP,我第一次听的时候就被震撼到了,原来音乐也可以有3D效果,那种带上耳机出现的环绕效果,对于听歌来说,体验真的很奇妙,而且这里面有很多的民间高手自己创作的音乐,很好听,还有弹幕式的评论,总体来说它属于一款小而精的APP。
五、乐网plus
这是一款广告拦截APP,专门针对视频广告、弹窗广告、恶意广告等进行拦截,这样就能舒服的看电视了,同时还能提升网页加载速度,减少流量的流失,算一款比较实用的APP吧,需要的朋友可以下载。
真的逆天的app,也就不太会冷门了。
所以我们还是说一下,你可能没见过的一些好的app,或者我们都觉得不错的app吧…
snapseed,vsco,修图必须
一言,文艺范十足
inside、rider、stack、dancing line,都是不错的 游戏 。
小小航海士,是个很怀旧的不错的单机大航海 游戏 。
篮球助手Pro,是我见过最好用的篮球计分系统,当然,如果有用着更好的介绍给我。
artomaton,一个将照片油画化的日本软件,效果很好,而且可以部分油画化。
slowfast,视频变快变慢
brushstorke 油画化图片,感觉上面的好些。
极简汇率,我喜欢简单专一的工具
变速map3,听mp3外语很有用,可以中段重播的复读机
onedrive,不说了吧,同步PC的网盘,我用了好多,金山之后,亿方云和网络感觉都太复杂了。
微车,我不能告诉你为啥微车好,我只能告诉你,如果你有一张电子拍照的扣分罚单,你用微车支付试试看,可能运气会好些。
clear,火极一时的代办任务。
锤子便签,虽然也有一些一般的地方,但是成长图效果还可以吧。
概念画板和sketchbook,手绘板最好的。
以上都是我手机必装的,太大众的就不写了,比如高德,你写他干嘛呢?
我真不知道app冷门后还能逆天,如果各位知道,告诉我。
我就是推荐下各位我觉得好用的app。
㈢ App Store 有哪些少有人知的逆天 app
MathStudio:
作为一个数学计算工具,那类似普通的 1 1 什么的四则运算表达式当然能做了,加减乘除、乘方、开方、指数、对数、(反)三角函数都可以计算。当然,既然称之为逆天,那绝对不止只能算一些这样的表达式。还可以:解方程。求极限也是小意思了,求导数,包括多元函数的偏导数。除了能求导,还可以算不定积分与定积分,画函数图像、方程图像更是小意思了。
MathStudio可以画:
2D 与 3D 的函数、方程图像
笛卡尔座标、极座标、柱座标
参数方程表述形式
隐函数曲线
矢量场
可以用滚动条来控制某个变量的大小
可以用时间来控制函数图像(使用特殊的变量 T),例如画 sin(x T) 的结果是一个不断平移的正弦波动画……
矩阵、行列式、线性方程组那些,比如计算矩阵的某个行列式、求逆矩阵、矩阵乘法、SVD 分解等等。傅里叶展开、概率论与数理统计那些,比如画正态分布曲线、求二项分布的 PDF (概率密度函数)和 CDF (概率累积函数)。
这个 App 居然还带了一个编程环境:
解析 JSON、元胞自动机,要是有闲情逸致可以搞出个俄罗斯方块或者贪吃蛇。
有人可能会想,这个和 WolframAlpha 相比怎么样?这个软件相对于 WolframAlpha 有个决定性的优点:不用联网。嗯,不用像 WolframAlpha 那样要先把计算需求发送到服务器那边,等服务器算一阵子再拿到结果,而是输入完需要计算的项目后点 Solve,Plot 等立刻能得到结果。当然,可以离线用。
然后,这个 App 居然还提供了 Apple Watch 支持:
最后,这么一个 App 下载下来占存储空间不到 4 MB。这基本就是一个中型、大型 App 的零头,甚至比某些游戏或 App 的单张贴图、切图还小。用 Wi-Fi 的话基本是秒下,就连用流量下载都不心疼。相比之下 WolframAlpha 要用二十多 MB。这样哪怕你用的是 16GB 版的 iPhone 都不会在意占用存储空间。
㈣ 用python如何求解非齐次线性方程组的一组正值特解,
其实更简单的“取值”方法是 令 x3 = x4 = 0,得特解 (1, 1, 0, 0)^T.
4 个未知数,2 个方程,任意给出 2 个未知数的值,
算出另 2 个未知数,都可以得到 1 组特解,
只不过形式越简单越好,例如取 特解 (1, 1, 0, 0)^T。
㈤ 万字教你如何用 Python 实现线性规划
想象一下,您有一个线性方程组和不等式系统。这样的系统通常有许多可能的解决方案。线性规划是一组数学和计算工具,可让您找到该系统的特定解,该解对应于某些其他线性函数的最大值或最小值。
混合整数线性规划是 线性规划 的扩展。它处理至少一个变量采用离散整数而不是连续值的问题。尽管乍一看混合整数问题与连续变量问题相似,但它们在灵活性和精度方面具有显着优势。
整数变量对于正确表示自然用整数表示的数量很重要,例如生产的飞机数量或服务的客户数量。
一种特别重要的整数变量是 二进制变量 。它只能取 零 或 一 的值,在做出是或否的决定时很有用,例如是否应该建造工厂或者是否应该打开或关闭机器。您还可以使用它们来模拟逻辑约束。
线性规划是一种基本的优化技术,已在科学和数学密集型领域使用了数十年。它精确、相对快速,适用于一系列实际应用。
混合整数线性规划允许您克服线性规划的许多限制。您可以使用分段线性函数近似非线性函数、使用半连续变量、模型逻辑约束等。它是一种计算密集型工具,但计算机硬件和软件的进步使其每天都更加适用。
通常,当人们试图制定和解决优化问题时,第一个问题是他们是否可以应用线性规划或混合整数线性规划。
以下文章说明了线性规划和混合整数线性规划的一些用例:
随着计算机能力的增强、算法的改进以及更多用户友好的软件解决方案的出现,线性规划,尤其是混合整数线性规划的重要性随着时间的推移而增加。
解决线性规划问题的基本方法称为,它有多种变体。另一种流行的方法是。
混合整数线性规划问题可以通过更复杂且计算量更大的方法来解决,例如,它在幕后使用线性规划。这种方法的一些变体是,它涉及使用 切割平面 ,以及。
有几种适用于线性规划和混合整数线性规划的合适且众所周知的 Python 工具。其中一些是开源的,而另一些是专有的。您是否需要免费或付费工具取决于问题的规模和复杂性,以及对速度和灵活性的需求。
值得一提的是,几乎所有广泛使用的线性规划和混合整数线性规划库都是以 Fortran 或 C 或 C++ 原生和编写的。这是因为线性规划需要对(通常很大)矩阵进行计算密集型工作。此类库称为求解器。Python 工具只是求解器的包装器。
Python 适合围绕本机库构建包装器,因为它可以很好地与 C/C++ 配合使用。对于本教程,您不需要任何 C/C++(或 Fortran),但如果您想了解有关此酷功能的更多信息,请查看以下资源:
基本上,当您定义和求解模型时,您使用 Python 函数或方法调用低级库,该库执行实际优化工作并将解决方案返回给您的 Python 对象。
几个免费的 Python 库专门用于与线性或混合整数线性规划求解器交互:
在本教程中,您将使用SciPy和PuLP来定义和解决线性规划问题。
在本节中,您将看到线性规划问题的两个示例:
您将在下一节中使用 Python 来解决这两个问题。
考虑以下线性规划问题:
你需要找到X和Ÿ使得红色,蓝色和黄色的不平等,以及不平等X 0和ÿ 0,是满意的。同时,您的解决方案必须对应于z的最大可能值。
您需要找到的自变量(在本例中为 x 和 y )称为 决策变量 。要最大化或最小化的决策变量的函数(在本例中为 z) 称为 目标函数 、 成本函数 或仅称为 目标 。您需要满足的 不等式 称为 不等式约束 。您还可以在称为 等式约束 的约束中使用方程。
这是您如何可视化问题的方法:
红线代表的功能2 X + Ý = 20,和它上面的红色区域示出了红色不等式不满足。同样,蓝线是函数 4 x + 5 y = 10,蓝色区域被禁止,因为它违反了蓝色不等式。黄线是 x + 2 y = 2,其下方的黄色区域是黄色不等式无效的地方。
如果您忽略红色、蓝色和黄色区域,则仅保留灰色区域。灰色区域的每个点都满足所有约束,是问题的潜在解决方案。该区域称为 可行域 ,其点为 可行解 。在这种情况下,有无数可行的解决方案。
您想最大化z。对应于最大z的可行解是 最优解 。如果您尝试最小化目标函数,那么最佳解决方案将对应于其可行的最小值。
请注意,z是线性的。你可以把它想象成一个三维空间中的平面。这就是为什么最优解必须在可行区域的 顶点 或角上的原因。在这种情况下,最佳解决方案是红线和蓝线相交的点,稍后您将看到。
有时,可行区域的整个边缘,甚至整个区域,都可以对应相同的z值。在这种情况下,您有许多最佳解决方案。
您现在已准备好使用绿色显示的附加等式约束来扩展问题:
方程式 x + 5 y = 15,以绿色书写,是新的。这是一个等式约束。您可以通过向上一张图像添加相应的绿线来将其可视化:
现在的解决方案必须满足绿色等式,因此可行区域不再是整个灰色区域。它是绿线从与蓝线的交点到与红线的交点穿过灰色区域的部分。后一点是解决方案。
如果插入x的所有值都必须是整数的要求,那么就会得到一个混合整数线性规划问题,可行解的集合又会发生变化:
您不再有绿线,只有沿线的x值为整数的点。可行解是灰色背景上的绿点,此时最优解离红线最近。
这三个例子说明了 可行的线性规划问题 ,因为它们具有有界可行区域和有限解。
如果没有解,线性规划问题是 不可行的 。当没有解决方案可以同时满足所有约束时,通常会发生这种情况。
例如,考虑如果添加约束x + y 1会发生什么。那么至少有一个决策变量(x或y)必须是负数。这与给定的约束x 0 和y 0相冲突。这样的系统没有可行的解决方案,因此称为不可行的。
另一个示例是添加与绿线平行的第二个等式约束。这两行没有共同点,因此不会有满足这两个约束的解决方案。
一个线性规划问题是 无界的 ,如果它的可行区域是无界,将溶液不是有限。这意味着您的变量中至少有一个不受约束,可以达到正无穷大或负无穷大,从而使目标也无限大。
例如,假设您采用上面的初始问题并删除红色和黄色约束。从问题中删除约束称为 放松 问题。在这种情况下,x和y不会在正侧有界。您可以将它们增加到正无穷大,从而产生无限大的z值。
在前面的部分中,您研究了一个与任何实际应用程序无关的抽象线性规划问题。在本小节中,您将找到与制造业资源分配相关的更具体和实用的优化问题。
假设一家工厂生产四种不同的产品,第一种产品的日产量为x ₁,第二种产品的产量为x 2,依此类推。目标是确定每种产品的利润最大化日产量,同时牢记以下条件:
数学模型可以这样定义:
目标函数(利润)在条件 1 中定义。人力约束遵循条件 2。对原材料 A 和 B 的约束可以从条件 3 和条件 4 中通过对每种产品的原材料需求求和得出。
最后,产品数量不能为负,因此所有决策变量必须大于或等于零。
与前面的示例不同,您无法方便地将其可视化,因为它有四个决策变量。但是,无论问题的维度如何,原理都是相同的。
在本教程中,您将使用两个Python 包来解决上述线性规划问题:
SciPy 设置起来很简单。安装后,您将拥有开始所需的一切。它的子包 scipy.optimize 可用于线性和非线性优化。
PuLP 允许您选择求解器并以更自然的方式表述问题。PuLP 使用的默认求解器是COIN-OR Branch and Cut Solver (CBC)。它连接到用于线性松弛的COIN-OR 线性规划求解器 (CLP)和用于切割生成的COIN-OR 切割生成器库 (CGL)。
另一个伟大的开源求解器是GNU 线性规划工具包 (GLPK)。一些着名且非常强大的商业和专有解决方案是Gurobi、CPLEX和XPRESS。
除了在定义问题时提供灵活性和运行各种求解器的能力外,PuLP 使用起来不如 Pyomo 或 CVXOPT 等替代方案复杂,后者需要更多的时间和精力来掌握。
要学习本教程,您需要安装 SciPy 和 PuLP。下面的示例使用 SciPy 1.4.1 版和 PuLP 2.1 版。
您可以使用pip以下方法安装两者:
您可能需要运行pulptest或sudo pulptest启用 PuLP 的默认求解器,尤其是在您使用 Linux 或 Mac 时:
或者,您可以下载、安装和使用 GLPK。它是免费和开源的,适用于 Windows、MacOS 和 Linux。在本教程的后面部分,您将看到如何将 GLPK(除了 CBC)与 PuLP 一起使用。
在 Windows 上,您可以下载档案并运行安装文件。
在 MacOS 上,您可以使用 Homebrew:
在 Debian 和 Ubuntu 上,使用apt来安装glpk和glpk-utils:
在Fedora,使用dnf具有glpk-utils:
您可能还会发现conda对安装 GLPK 很有用:
安装完成后,可以查看GLPK的版本:
有关详细信息,请参阅 GLPK 关于使用Windows 可执行文件和Linux 软件包进行安装的教程。
在本节中,您将学习如何使用 SciPy优化和求根库进行线性规划。
要使用 SciPy 定义和解决优化问题,您需要导入scipy.optimize.linprog():
现在您已经linprog()导入,您可以开始优化。
让我们首先解决上面的线性规划问题:
linprog()仅解决最小化(而非最大化)问题,并且不允许具有大于或等于符号 ( ) 的不等式约束。要解决这些问题,您需要在开始优化之前修改您的问题:
引入这些更改后,您将获得一个新系统:
该系统与原始系统等效,并且将具有相同的解决方案。应用这些更改的唯一原因是克服 SciPy 与问题表述相关的局限性。
下一步是定义输入值:
您将上述系统中的值放入适当的列表、元组或NumPy 数组中:
注意:请注意行和列的顺序!
约束左侧和右侧的行顺序必须相同。每一行代表一个约束。
来自目标函数和约束左侧的系数的顺序必须匹配。每列对应一个决策变量。
下一步是以与系数相同的顺序定义每个变量的界限。在这种情况下,它们都在零和正无穷大之间:
此语句是多余的,因为linprog()默认情况下采用这些边界(零到正无穷大)。
注:相反的float("inf"),你可以使用math.inf,numpy.inf或scipy.inf。
最后,是时候优化和解决您感兴趣的问题了。你可以这样做linprog():
参数c是指来自目标函数的系数。A_ub和b_ub分别与不等式约束左边和右边的系数有关。同样,A_eq并b_eq参考等式约束。您可以使用bounds提供决策变量的下限和上限。
您可以使用该参数method来定义要使用的线性规划方法。有以下三种选择:
linprog() 返回具有以下属性的数据结构:
您可以分别访问这些值:
这就是您获得优化结果的方式。您还可以以图形方式显示它们:
如前所述,线性规划问题的最优解位于可行区域的顶点。在这种情况下,可行区域只是蓝线和红线之间的绿线部分。最优解是代表绿线和红线交点的绿色方块。
如果要排除相等(绿色)约束,只需删除参数A_eq并b_eq从linprog()调用中删除:
解决方案与前一种情况不同。你可以在图表上看到:
在这个例子中,最优解是红色和蓝色约束相交的可行(灰色)区域的紫色顶点。其他顶点,如黄色顶点,具有更高的目标函数值。
您可以使用 SciPy 来解决前面部分所述的资源分配问题:
和前面的例子一样,你需要从上面的问题中提取必要的向量和矩阵,将它们作为参数传递给.linprog(),然后得到结果:
结果告诉您最大利润是1900并且对应于x ₁ = 5 和x ₃ = 45。在给定条件下生产第二和第四个产品是没有利润的。您可以在这里得出几个有趣的结论:
opt.statusis0和opt.successis True,说明优化问题成功求解,最优可行解。
SciPy 的线性规划功能主要用于较小的问题。对于更大和更复杂的问题,您可能会发现其他库更适合,原因如下:
幸运的是,Python 生态系统为线性编程提供了几种替代解决方案,这些解决方案对于更大的问题非常有用。其中之一是 PuLP,您将在下一节中看到它的实际应用。
PuLP 具有比 SciPy 更方便的线性编程 API。您不必在数学上修改您的问题或使用向量和矩阵。一切都更干净,更不容易出错。
像往常一样,您首先导入您需要的内容:
现在您已经导入了 PuLP,您可以解决您的问题。
您现在将使用 PuLP 解决此系统:
第一步是初始化一个实例LpProblem来表示你的模型:
您可以使用该sense参数来选择是执行最小化(LpMinimize或1,这是默认值)还是最大化(LpMaximize或-1)。这个选择会影响你的问题的结果。
一旦有了模型,就可以将决策变量定义为LpVariable类的实例:
您需要提供下限,lowBound=0因为默认值为负无穷大。该参数upBound定义了上限,但您可以在此处省略它,因为它默认为正无穷大。
可选参数cat定义决策变量的类别。如果您使用的是连续变量,则可以使用默认值"Continuous"。
您可以使用变量x和y创建表示线性表达式和约束的其他 PuLP 对象:
当您将决策变量与标量相乘或构建多个决策变量的线性组合时,您会得到一个pulp.LpAffineExpression代表线性表达式的实例。
注意:您可以增加或减少变量或表达式,你可以乘他们常数,因为纸浆类实现一些Python的特殊方法,即模拟数字类型一样__add__(),__sub__()和__mul__()。这些方法用于像定制运营商的行为+,-和*。
类似地,您可以将线性表达式、变量和标量与运算符 ==、=以获取表示模型线性约束的纸浆.LpConstraint实例。
注:也有可能与丰富的比较方法来构建的约束.__eq__(),.__le__()以及.__ge__()定义了运营商的行为==,=。
考虑到这一点,下一步是创建约束和目标函数并将它们分配给您的模型。您不需要创建列表或矩阵。只需编写 Python 表达式并使用+=运算符将它们附加到模型中:
在上面的代码中,您定义了包含约束及其名称的元组。LpProblem允许您通过将约束指定为元组来向模型添加约束。第一个元素是一个LpConstraint实例。第二个元素是该约束的可读名称。
设置目标函数非常相似:
或者,您可以使用更短的符号:
现在您已经添加了目标函数并定义了模型。
注意:您可以使用运算符将 约束或目标附加到模型中,+=因为它的类LpProblem实现了特殊方法.__iadd__(),该方法用于指定 的行为+=。
对于较大的问题,lpSum()与列表或其他序列一起使用通常比重复+运算符更方便。例如,您可以使用以下语句将目标函数添加到模型中:
它产生与前一条语句相同的结果。
您现在可以看到此模型的完整定义:
模型的字符串表示包含所有相关数据:变量、约束、目标及其名称。
注意:字符串表示是通过定义特殊方法构建的.__repr__()。有关 的更多详细信息.__repr__(),请查看Pythonic OOP 字符串转换:__repr__vs__str__ .
最后,您已准备好解决问题。你可以通过调用.solve()你的模型对象来做到这一点。如果要使用默认求解器 (CBC),则不需要传递任何参数:
.solve()调用底层求解器,修改model对象,并返回解决方案的整数状态,1如果找到了最优解。有关其余状态代码,请参阅LpStatus[]。
你可以得到优化结果作为 的属性model。该函数value()和相应的方法.value()返回属性的实际值:
model.objective持有目标函数model.constraints的值,包含松弛变量的值,以及对象x和y具有决策变量的最优值。model.variables()返回一个包含决策变量的列表:
如您所见,此列表包含使用 的构造函数创建的确切对象LpVariable。
结果与您使用 SciPy 获得的结果大致相同。
注意:注意这个方法.solve()——它会改变对象的状态,x并且y!
您可以通过调用查看使用了哪个求解器.solver:
输出通知您求解器是 CBC。您没有指定求解器,因此 PuLP 调用了默认求解器。
如果要运行不同的求解器,则可以将其指定为 的参数.solve()。例如,如果您想使用 GLPK 并且已经安装了它,那么您可以solver=GLPK(msg=False)在最后一行使用。请记住,您还需要导入它:
现在你已经导入了 GLPK,你可以在里面使用它.solve():
该msg参数用于显示来自求解器的信息。msg=False禁用显示此信息。如果要包含信息,则只需省略msg或设置msg=True。
您的模型已定义并求解,因此您可以按照与前一种情况相同的方式检查结果:
使用 GLPK 得到的结果与使用 SciPy 和 CBC 得到的结果几乎相同。
一起来看看这次用的是哪个求解器:
正如您在上面用突出显示的语句定义的那样model.solve(solver=GLPK(msg=False)),求解器是 GLPK。
您还可以使用 PuLP 来解决混合整数线性规划问题。要定义整数或二进制变量,只需传递cat="Integer"或cat="Binary"到LpVariable。其他一切都保持不变:
在本例中,您有一个整数变量并获得与之前不同的结果:
Nowx是一个整数,如模型中所指定。(从技术上讲,它保存一个小数点后为零的浮点值。)这一事实改变了整个解决方案。让我们在图表上展示这一点:
如您所见,最佳解决方案是灰色背景上最右边的绿点。这是两者的最大价值的可行的解决方案x和y,给它的最大目标函数值。
GLPK 也能够解决此类问题。
现在你可以使用 PuLP 来解决上面的资源分配问题:
定义和解决问题的方法与前面的示例相同:
在这种情况下,您使用字典 x来存储所有决策变量。这种方法很方便,因为字典可以将决策变量的名称或索引存储为键,将相应的LpVariable对象存储为值。列表或元组的LpVariable实例可以是有用的。
上面的代码产生以下结果:
如您所见,该解决方案与使用 SciPy 获得的解决方案一致。最有利可图的解决方案是每天生产5.0第一件产品和45.0第三件产品。
让我们把这个问题变得更复杂和有趣。假设由于机器问题,工厂无法同时生产第一种和第三种产品。在这种情况下,最有利可图的解决方案是什么?
现在您有另一个逻辑约束:如果x ₁ 为正数,则x ₃ 必须为零,反之亦然。这是二元决策变量非常有用的地方。您将使用两个二元决策变量y ₁ 和y ₃,它们将表示是否生成了第一个或第三个产品:
除了突出显示的行之外,代码与前面的示例非常相似。以下是差异:
这是解决方案:
事实证明,最佳方法是排除第一种产品而只生产第三种产品。
就像有许多资源可以帮助您学习线性规划和混合整数线性规划一样,还有许多具有 Python 包装器的求解器可用。这是部分列表:
其中一些库,如 Gurobi,包括他们自己的 Python 包装器。其他人使用外部包装器。例如,您看到可以使用 PuLP 访问 CBC 和 GLPK。
您现在知道什么是线性规划以及如何使用 Python 解决线性规划问题。您还了解到 Python 线性编程库只是本机求解器的包装器。当求解器完成其工作时,包装器返回解决方案状态、决策变量值、松弛变量、目标函数等。
㈥ Python怎么做最优化
最优化
为什么要做最优化呢?因为在生活中,人们总是希望幸福值或其它达到一个极值,比如做生意时希望成本最小,收入最大,所以在很多商业情境中,都会遇到求极值的情况。
函数求根
这里“函数的根”也称“方程的根”,或“函数的零点”。
先把我们需要的包加载进来。import numpy as npimport scipy as spimport scipy.optimize as optimport matplotlib.pyplot as plt%matplotlib inline
函数求根和最优化的关系?什么时候函数是最小值或最大值?
两个问题一起回答:最优化就是求函数的最小值或最大值,同时也是极值,在求一个函数最小值或最大值时,它所在的位置肯定是导数为 0 的位置,所以要求一个函数的极值,必然要先求导,使其为 0,所以函数求根就是为了得到最大值最小值。
scipy.optimize 有什么方法可以求根?
可以用 scipy.optimize 中的 bisect 或 brentq 求根。f = lambda x: np.cos(x) - x # 定义一个匿名函数x = np.linspace(-5, 5, 1000) # 先生成 1000 个 xy = f(x) # 对应生成 1000 个 f(x)plt.plot(x, y); # 看一下这个函数长什么样子plt.axhline(0, color='k'); # 画一根横线,位置在 y=0
opt.bisect(f, -5, 5) # 求取函数的根0.7390851332155535plt.plot(x, y)plt.axhline(0, color='k')plt.scatter([_], [0], c='r', s=100); # 这里的 [_] 表示上一个 Cell 中的结果,这里是 x 轴上的位置,0 是 y 上的位置
求根有两种方法,除了上面介绍的 bisect,还有 brentq,后者比前者快很多。%timeit opt.bisect(f, -5, 5)%timeit opt.brentq(f, -5, 5)10000 loops, best of 3: 157 s per loopThe slowest run took 11.65 times longer than the fastest. This could mean that an intermediate result is being cached.10000 loops, best of 3: 35.9 s per loop
函数求最小化
求最小值就是一个最优化问题。求最大值时只需对函数做一个转换,比如加一个负号,或者取倒数,就可转成求最小值问题。所以两者是同一问题。
初始值对最优化的影响是什么?
举例来说,先定义个函数。f = lambda x: 1-np.sin(x)/xx = np.linspace(-20., 20., 1000)y = f(x)
当初始值为 3 值,使用 minimize 函数找到最小值。minimize 函数是在新版的 scipy 里,取代了以前的很多最优化函数,是个通用的接口,背后是很多方法在支撑。x0 = 3xmin = opt.minimize(f, x0).x # x0 是起始点,起始点最好离真正的最小值点不要太远plt.plot(x, y)plt.scatter(x0, f(x0), marker='o', s=300); # 起始点画出来,用圆圈表示plt.scatter(xmin, f(xmin), marker='v', s=300); # 最小值点画出来,用三角表示plt.xlim(-20, 20);
初始值为 3 时,成功找到最小值。
现在来看看初始值为 10 时,找到的最小值点。x0 = 10xmin = opt.minimize(f, x0).xplt.plot(x, y)plt.scatter(x0, f(x0), marker='o', s=300)plt.scatter(xmin, f(xmin), marker='v', s=300)plt.xlim(-20, 20);
由上图可见,当初始值为 10 时,函数找到的是局部最小值点,可见 minimize 的默认算法对起始点的依赖性。
那么怎么才能不管初始值在哪个位置,都能找到全局最小值点呢?
如何找到全局最优点?
可以使用 basinhopping 函数找到全局最优点,相关背后算法,可以看帮助文件,有提供论文的索引和出处。
我们设初始值为 10 看是否能找到全局最小值点。x0 = 10from scipy.optimize import basinhoppingxmin = basinhopping(f,x0,stepsize = 5).xplt.plot(x, y);plt.scatter(x0, f(x0), marker='o', s=300);plt.scatter(xmin, f(xmin), marker='v', s=300);plt.xlim(-20, 20);
当起始点在比较远的位置,依然成功找到了全局最小值点。
如何求多元函数最小值?
以二元函数为例,使用 minimize 求对应的最小值。def g(X): x,y = X return (x-1)**4 + 5 * (y-1)**2 - 2*x*yX_opt = opt.minimize(g, (8, 3)).x # (8,3) 是起始点print X_opt[ 1.88292611 1.37658521]fig, ax = plt.subplots(figsize=(6, 4)) # 定义画布和图形x_ = y_ = np.linspace(-1, 4, 100)X, Y = np.meshgrid(x_, y_)c = ax.contour(X, Y, g((X, Y)), 50) # 等高线图ax.plot(X_opt[0], X_opt[1], 'r*', markersize=15) # 最小点的位置是个元组ax.set_xlabel(r"$x_1$", fontsize=18)ax.set_ylabel(r"$x_2$", fontsize=18)plt.colorbar(c, ax=ax) # colorbar 表示颜色越深,高度越高fig.tight_layout()
画3D 图。from mpl_toolkits.mplot3d import Axes3Dfrom matplotlib import cmfig = plt.figure()ax = fig.gca(projection='3d')x_ = y_ = np.linspace(-1, 4, 100)X, Y = np.meshgrid(x_, y_)surf = ax.plot_surface(X, Y, g((X,Y)), rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=0, antialiased=False)cset = ax.contour(X, Y, g((X,Y)), zdir='z',offset=-5, cmap=cm.coolwarm)fig.colorbar(surf, shrink=0.5, aspect=5);
曲线拟合
曲线拟合和最优化有什么关系?
曲线拟合的问题是,给定一组数据,它可能是沿着一条线散布的,这时要找到一条最优的曲线来拟合这些数据,也就是要找到最好的线来代表这些点,这里的最优是指这些点和线之间的距离是最小的,这就是为什么要用最优化问题来解决曲线拟合问题。
举例说明,给一些点,找到一条线,来拟合这些点。
先给定一些点:N = 50 # 点的个数m_true = 2 # 斜率b_true = -1 # 截距dy = 2.0 # 误差np.random.seed(0)xdata = 10 * np.random.random(N) # 50 个 x,服从均匀分布ydata = np.random.normal(b_true + m_true * xdata, dy) # dy 是标准差plt.errorbar(xdata, ydata, dy, fmt='.k', ecolor='lightgray');
上面的点整体上呈现一个线性关系,要找到一条斜线来代表这些点,这就是经典的一元线性回归。目标就是找到最好的线,使点和线的距离最短。要优化的函数是点和线之间的距离,使其最小。点是确定的,而线是可变的,线是由参数值,斜率和截距决定的,这里就是要通过优化距离找到最优的斜率和截距。
点和线的距离定义如下:def chi2(theta, x, y): return np.sum(((y - theta[0] - theta[1] * x)) ** 2)
上式就是误差平方和。
误差平方和是什么?有什么作用?
误差平方和公式为:
误差平方和大,表示真实的点和预测的线之间距离太远,说明拟合得不好,最好的线,应该是使误差平方和最小,即最优的拟合线,这里是条直线。
误差平方和就是要最小化的目标函数。
找到最优的函数,即斜率和截距。theta_guess = [0, 1] # 初始值theta_best = opt.minimize(chi2, theta_guess, args=(xdata, ydata)).xprint(theta_best)[-1.01442005 1.93854656]
上面两个输出即是预测的直线斜率和截距,我们是根据点来反推直线的斜率和截距,那么真实的斜率和截距是多少呢?-1 和 2,很接近了,差的一点是因为有噪音的引入。xfit = np.linspace(0, 10)yfit = theta_best[0] + theta_best[1] * xfitplt.errorbar(xdata, ydata, dy, fmt='.k', ecolor='lightgray');plt.plot(xfit, yfit, '-k');
最小二乘(Least Square)是什么?
上面用的是 minimize 方法,这个问题的目标函数是误差平方和,这就又有一个特定的解法,即最小二乘。
最小二乘的思想就是要使得观测点和估计点的距离的平方和达到最小,这里的“二乘”指的是用平方来度量观测点与估计点的远近(在古汉语中“平方”称为“二乘”),“最小”指的是参数的估计值要保证各个观测点与估计点的距离的平方和达到最小。
关于最小二乘估计的计算,涉及更多的数学知识,这里不想详述,其一般的过程是用目标函数对各参数求偏导数,并令其等于 0,得到一个线性方程组。具体推导过程可参考斯坦福机器学习讲义 第 7 页。def deviations(theta, x, y): return (y - theta[0] - theta[1] * x)theta_best, ier = opt.leastsq(deviations, theta_guess, args=(xdata, ydata))print(theta_best)[-1.01442016 1.93854659]
最小二乘 leastsq 的结果跟 minimize 结果一样。注意 leastsq 的第一个参数不再是误差平方和 chi2,而是误差本身 deviations,即没有平方,也没有和。yfit = theta_best[0] + theta_best[1] * xfitplt.errorbar(xdata, ydata, dy, fmt='.k', ecolor='lightgray');plt.plot(xfit, yfit, '-k');
非线性最小二乘
上面是给一些点,拟合一条直线,拟合一条曲线也是一样的。def f(x, beta0, beta1, beta2): # 首先定义一个非线性函数,有 3 个参数 return beta0 + beta1 * np.exp(-beta2 * x**2)beta = (0.25, 0.75, 0.5) # 先猜 3 个 betaxdata = np.linspace(0, 5, 50)y = f(xdata, *beta)ydata = y + 0.05 * np.random.randn(len(xdata)) # 给 y 加噪音def g(beta): return ydata - f(xdata, *beta) # 真实 y 和 预测值的差,求最优曲线时要用到beta_start = (1, 1, 1)beta_opt, beta_cov = opt.leastsq(g, beta_start)print beta_opt # 求到的 3 个最优的 beta 值[ 0.25525709 0.74270226 0.54966466]
拿估计的 beta_opt 值跟真实的 beta = (0.25, 0.75, 0.5) 值比较,差不多。fig, ax = plt.subplots()ax.scatter(xdata, ydata) # 画点ax.plot(xdata, y, 'r', lw=2) # 真实值的线ax.plot(xdata, f(xdata, *beta_opt), 'b', lw=2) # 拟合的线ax.set_xlim(0, 5)ax.set_xlabel(r"$x$", fontsize=18)ax.set_ylabel(r"$f(x, \beta)$", fontsize=18)fig.tight_layout()
除了使用最小二乘,还可以使用曲线拟合的方法,得到的结果是一样的。beta_opt, beta_cov = opt.curve_fit(f, xdata, ydata)print beta_opt[ 0.25525709 0.74270226 0.54966466]
有约束的最小化
有约束的最小化是指,要求函数最小化之外,还要满足约束条件,举例说明。
边界约束def f(X): x, y = X return (x-1)**2 + (y-1)**2 # 这是一个碗状的函数x_opt = opt.minimize(f, (0, 0), method='BFGS').x # 无约束最优化
假设有约束条件,x 和 y 要在一定的范围内,如 x 在 2 到 3 之间,y 在 0 和 2 之间。bnd_x1, bnd_x2 = (2, 3), (0, 2) # 对自变量的约束x_cons_opt = opt.minimize(f, np.array([0, 0]), method='L-BFGS-B', bounds=[bnd_x1, bnd_x2]).x # bounds 矩形约束fig, ax = plt.subplots(figsize=(6, 4))x_ = y_ = np.linspace(-1, 3, 100)X, Y = np.meshgrid(x_, y_)c = ax.contour(X, Y, f((X,Y)), 50)ax.plot(x_opt[0], x_opt[1], 'b*', markersize=15) # 没有约束下的最小值,蓝色五角星ax.plot(x_cons_opt[0], x_cons_opt[1], 'r*', markersize=15) # 有约束下的最小值,红色星星bound_rect = plt.Rectangle((bnd_x1[0], bnd_x2[0]), bnd_x1[1] - bnd_x1[0], bnd_x2[1] - bnd_x2[0], facecolor="grey")ax.add_patch(bound_rect)ax.set_xlabel(r"$x_1$", fontsize=18)ax.set_ylabel(r"$x_2$", fontsize=18)plt.colorbar(c, ax=ax)fig.tight_layout()
不等式约束
介绍下相关理论,先来看下存在等式约束的极值问题求法,比如下面的优化问题。
目标函数是 f(w),下面是等式约束,通常解法是引入拉格朗日算子,这里使用 ββ 来表示算子,得到拉格朗日公式为
l 是等式约束的个数。
然后分别对 w 和ββ 求偏导,使得偏导数等于 0,然后解出 w 和βiβi,至于为什么引入拉格朗日算子可以求出极值,原因是 f(w) 的 dw 变化方向受其他不等式的约束,dw的变化方向与f(w)的梯度垂直时才能获得极值,而且在极值处,f(w) 的梯度与其他等式梯度的线性组合平行,因此他们之间存在线性关系。(参考《最优化与KKT条件》)
对于不等式约束的极值问题
常常利用拉格朗日对偶性将原始问题转换为对偶问题,通过解对偶问题而得到原始问题的解。该方法应用在许多统计学习方法中。有兴趣的可以参阅相关资料,这里不再赘述。def f(X): return (X[0] - 1)**2 + (X[1] - 1)**2def g(X): return X[1] - 1.75 - (X[0] - 0.75)**4x_opt = opt.minimize(f, (0, 0), method='BFGS').xconstraints = [dict(type='ineq', fun=g)] # 约束采用字典定义,约束方式为不等式约束,边界用 g 表示x_cons_opt = opt.minimize(f, (0, 0), method='SLSQP', constraints=constraints).xfig, ax = plt.subplots(figsize=(6, 4))x_ = y_ = np.linspace(-1, 3, 100)X, Y = np.meshgrid(x_, y_)c = ax.contour(X, Y, f((X, Y)), 50)ax.plot(x_opt[0], x_opt[1], 'b*', markersize=15) # 蓝色星星,没有约束下的最小值ax.plot(x_, 1.75 + (x_-0.75)**4, '', markersize=15)ax.fill_between(x_, 1.75 + (x_-0.75)**4, 3, color="grey")ax.plot(x_cons_opt[0], x_cons_opt[1], 'r*', markersize=15) # 在区域约束下的最小值ax.set_ylim(-1, 3)ax.set_xlabel(r"$x_0$", fontsize=18)ax.set_ylabel(r"$x_1$", fontsize=18)plt.colorbar(c, ax=ax)fig.tight_layout()
scipy.optimize.minimize 中包括了多种最优化算法,每种算法使用范围不同,详细参考官方文档。
㈦ 单纯形表法求解目标函数最小值时,有两个非基变量的负检验数相同,如何选择入基变量
因为基本可行解的个数有限,故经有限次转换必能得出问题的最优解。从线性方程组找出一个个的单纯形,每一个单纯形可以求得一组解,然后再判断该解使目标函数值是增大还是变小了,决定下一步选择的单纯形。通过优化迭代,直到目标函数实现最大或最小值。如果线性问题存在最优解,一定有一个基可行解是有最优解。因此单纯形法迭代的基本思路是:先找出一个基可行解,判断其是否为最优解。如为否,则转换到相邻的基可行解,并使目标函数值不断增大,一直找到最优解为止。(7)python解线性方程组扩展阅读:由于目标函数和约束条件内容和形式上的差别,线性规划问题可以有多种表达式。因此,为了便于讨论和制定统一的算法,在制定单纯形法时,规定使用单纯形法求解的线性规划问题需要有一个标准形式,它有下面三个特征:(1) 标准形式目标函数统一为求极大值或极小值,但单纯形法主要用来求解极大值;(2) 所有约束条件(除非负条件外)都是等式,约束条件右端常数项bi全为非负值;(3) 所有变量的取值全为非负值。
搜索
免费python全套教程
python必背100源代码
编程入门教程300例
初学编程100个简单教程
初中数学全套解题技巧
编程必背50个程序
㈧ C++ opencv曲线拟合
简介:此问题是在做旋转模板匹配的时候,选择最好的匹配结果时产生的。查找资料发现多项式拟合问题可以变成一个超定方程的求解问题,而opencv中本身有一个cv::solve()函数可以求解线性方程组,因此对于大多数用到opencv又要进行曲线拟合的地方都可以参考此处的求解过程来解决。
原始数据是一些离散的散点,下图是用matplotlib的plot方法画出来的,我想得到下图中最高处附近的近似的曲线方程,以得到一个最大值和最大值对应的横坐标。从下图看,在最高处附近很像一条抛物线,那就用2次函数去拟合最高处附近的曲线看看效果
二次函数的一般形式为 ,二次函数由 完全决定,这样只需要三组 的数据我们就可以求出 的表达式。例如现在我们获得了三组数据, ,写成方程组的形式就是
求解这个线性方程组就可以得到我们需要的二次方程,很容易求出来 。
在实际的情况下我们观测获得的数据并不是绝对准确的,也就是存在偏差,当数据足够多时就可以去除很大一部分随机误差,但是当方程数超过未知数的个数时,怎么求解呢?这就要引入下面 超定方程 的知识了。
设方程Ax = b.根据有效的方程个数和未知数的个数,可以分为以下3种情况:
设方程组 中, , 是 维已知向量, 是n维解向量,当 ,即方程个数大于自变量个数时,称此方程组为超定方程组。
记 ,称使 最小的解 为方程组 的最小二乘解。
是 的最小二乘解的充要条件是: 是 的解。
, ,
构造 ,求解此线性方程组就可以得到最小二乘解,也就得到我们需要的二次方程了。
可以和python实现版对照着看最后拟合的方程是一样的!完美!
参考:
超定方程理论参考: https://blog.csdn.net/u014652390/article/details/52789591
㈨ 用MATLAB求解线性方程组解的方差阵
本人使用Python编程求最小二乘问题解得以下结果
x=[ -3.52600181e-06, 1.05613278e+02, -6.32534301e+01,
2.13574439e+02, -1.12594750e+01, 2.46124268e+01,
-1.19712190e+00, 2.49220346e-02, -1.87255444e-04,
8.69844609e+01, -2.06283690e-02],
残差=[ 0.02367883],
A的秩11,
A的奇异值=[ 5.50618827e+06, 4.26972794e+03, 1.30077642e+02,
5.82579037e+00, 1.14228947e+00, 9.99923434e-01,
1.36385035e-01, 2.65709448e-02, 4.01400241e-03,
1.77324993e-03, 6.67012472e-05]
希望可以帮你下
在MATLAB中编程也ok
㈩ 这题怎么只用一个X来设方程不许用两个,只能用一个X来设
设大人有x个人,则小孩有100-x个人。故按照题设可知
3x+(100-x)/3=100
9x+100-x=300
8x=200
x=25
故大人有25人,小孩有100-25=75人