【计算方法】非线性方程和优化
0.WARNINGS
本文章主要适用于计算方法代码的实现参考,由于本人是python究极小白,为了实验课速成了一些内容,因此会包含较多的暴力解法orz,如有代码错误、可优化的地方欢迎各位大佬指出,感激不尽。
此外,本人制作本文的目的,主要是懒的将代码保存在本地中,且博客方便个人的复习。
非线性方程和优化主要包含的内容有:二分法;普通迭代法;牛顿迭代法;弦截法(单点&两点);
1.
用二分法求方程 xlnx = 1 在[0.5 , 4] 的近似根,使函数值误差不超过0.001,或有根区间长度不超过0.001。输出保留3位小数。
import matha=0.5
b=4def f(x):return x*math.log(x)-1while 1:mid=a / 2 + b / 2if math.fabs(f(mid)) < 0.001 or math.fabs(a - b) < 0.001:ret = midbreakelse:if f(mid)*f(a)<=0:b=midelse:a=midprint("%.3f" % ret)
2.
用迭代法求方程 x= e –x在x=0.5附近的一个根,结果的精度要求0.00001。输出保留4位小数
import mathdef f(x):return math.e**(-x)x=0.5while 1:temp=xx=f(x)if math.fabs(temp-x)<0.00001:breakprint("%.4f" % x)
3.
用迭代法求函数f(x)=x-lnx-2在区间(2,+∞)内的零点,误差是0.00001,最高迭代次数是500次。输出保留三位小数。
import mathdef f(x):return math.log(x)+2x=2
cnt=0
while cnt<=500:temp=xx=f(x)if math.fabs(temp-x)<0.00001:breakelse:cnt += 1print("%.3f" % x)
4.
用迭代法求方程3 x2- e x=0在[3,4]区间的一个根,结果的精度要求0.0001。输出保留3位小数
import mathdef f(x):return math.log(3*x**2)x=3.5
while x>=3 and x<=4:temp=xx=f(x)if math.fabs(temp-x)<0.00001:breakprint("%.3f" % x)
5.
输出x^3-x^2-1=0的有根区间,并在该有根区间内通过二分法找到其具有4位有效数字的根。
注意:有根区间的长度为0.1,输出到小数点后1位。
例如:
输出:
3.5(有根区间左端点)
3.6(有根区间右端点)
3.578(根)
(此非该题的正确解,只是示例)
import mathdef f(x):return pow(x,3)-pow(x,2)-1# 容易发现f(1)<0 and f(2)>0
i=1
while i<2:i+=0.1if f(i)>0:b=ia=i-0.1break
print("%.1f" % a)
# (有根区间左端点)
print("%.1f" % b)
# (有根区间右端点)while 1:mid=a/2+b/2if math.fabs(f(mid))<0.001 or math.fabs(a-b)<0.001:ret=midbreakelse:if f(mid)*f(a)<=0:b=midelse:a=mid
print("%.3f" % ret)
# (根)
6.
设函数f(x)=sinx-(x/2)2,牛顿法求函数的根。初始值是2.0,误差是0.0001,最高迭代次数是500次。输出保留三位小数。
import math# 设函数f(x)=sinx-(x/2)2,牛顿法求函数的根。
# 初始值是2.0,误差是0.0001,最高迭代次数是500次。输出保留三位小数。def f(x):return math.sin(x)-(x/2)**2def f1(x):return math.cos(x)-x/2def fai(x):return x-f(x)/f1(x)cnt=0
e=0.0001
myx=2.0
while cnt<500:temp=fai(myx)if math.fabs(temp-myx)<e:myx=tempbreakelse:myx=tempprint("%.3f" % myx)
7.
用牛顿迭代法求解x2=A的根,要求误差小于0.00001
输入:A
输出:迭代序列值 迭代次数(从初值x0=A开始迭代)迭代值保留5位有效数字
例如:
输入: 7
输出: 4.00000 1
2.87500 2
2.65489 3
2.64577 4
2.64575 5
2.64575 6
import math# 用牛顿迭代法求解x2=A的根,要求误差小于0.00001A=float(input())def fai(x,A):return x-(x**2-A)/(2*x)e=0.00001
myx=A
cnt=int(0)
while 1:temp=fai(myx,A)if math.fabs(temp-myx)<e:myx=tempcnt+=1breakelse:myx=tempcnt+=1print("%.5f %d" % (myx, cnt))print("%.5f %d" % (myx,cnt))
8.
对非零实数a,采用牛顿迭代法设计一个不用除法运算求解1/a的计算程序。误差小于10-5 初值x0=0.01
输入:a
输出:迭代序列 (保留5位小数) 迭代次数
例如:
输入:7
输出:
0.01930 1
0.03599 2
0.06292 3
0.09812 4
0.12885 5
0.14148 6
0.14284 7
0.14286 8
0.14286 9
import math
import sys# 对非零实数a,采用牛顿迭代法设计一个不用除法运算求解1/a的计算程序。
# 误差小于10-5 初值x0=0.01a=float(input())if a==0:print("a cannot be zero")sys.exit()def f(x,a):return 1/x-adef f1(x,a):return -1/(x**2)def fai(x,a):return x-f(x,a)/f1(x,a)e=0.00001
myx=0.01
cnt=int(0)
# fx=1/x
while 1:temp=fai(myx,a)if math.fabs(temp-myx)<e:myx=tempcnt+=1breakelse:myx=tempcnt+=1print("%.5f %d" % (myx,cnt))print("%.5f %d" % (myx,cnt))
9.
在重根数未知情况下,求解非线性方程f(x)=e^(2x)-1-2x-2x^2的误差小于0.0001的根。
输入迭代初始值,输出每次的近似解和迭代次数(空格分隔),近似解保留小数点后5。
例如:
输入:2
输出:
-2.47756 1
-0.26450 2
-0.00996 3
-0.00002 4
0.00000 5
import math
import sysdef f(x):return math.e**(2*x)-1-2*x-2*x**2def f1(x):return 2*math.e**(2*x)-2-4*xdef f2(x):return 4*math.e**(2*x)-4def fai(x):return x-f1(x)*f(x)/(f1(x)**2-f(x)*f2(x))e=0.0001
cnt=int(0)
myx=float(input())while 1:temp=fai(myx)if math.fabs(temp-myx)<e:myx = tempcnt += 1breakelse:myx=tempcnt+=1print("%.5f %d" % (myx,cnt))print("%.5f %d" % (myx,cnt))
10.
单点弦截法求f(x)=x-sinx-1在[1,2]区间解,误差为0.0001
输入格式:
a的值 b的值 (a为定点)
输出格式:
根(保留4位小数)迭代次数
输入:
1 2
输出:
1.9346 12
import mathinp = input().split(' ')
a = float(inp[0])
b = float(inp[1])e=0.0001
cnt=int(1)def f(x):return x-math.sin(x)-1def fai(x,x0):return x-f(x)/(f(x)-f(x0))*(x-x0)
# x0=awhile 1:if math.fabs(b-fai(b,a))<e:b+=ebreakelse:b=fai(b,a)cnt+=1print("%.4f %d" % (b,cnt))
11.
用双点弦法求方程 xex-1=0 在x=0.5附近的根。初始两点分别是0.3, 0.8, 最高迭代次数是500次,误差是0.0001。输出后值,并保留三位小数。
import math
# 用双点弦法求方程 xex-1=0 在x=0.5附近的根。初始两点分别是0.3, 0.8,
# 最高迭代次数是500次,误差是0.0001。输出后值,并保留三位小数。def f(x):return x*math.e**x-1def fai(xk,x):return xk-f(xk)/(f(xk)-f(x))*(xk-x)
# xk=b,x=ae=0.0001
a=0.3
b=0.8
cnt=1
myx=0while cnt<=500:if math.fabs(fai(b,a)-myx)<e:myx = fai(b, a)# output the latter one?breakelse:myx=fai(b,a)a=bb=myxcnt+=1print("%.3f" % myx)
12.
对于f(x)=x3-3x-1用三种方法求解。输入两个初值,x0和x1,其中xo作为牛顿法的初值进行迭代求解,x0为单点弦截的不动点和x1作为初值迭代求解,x0和x1作为双点弦截的不动点迭代求解,误差小于0.00001。输出迭代值和迭代次数,迭代值保留5位有小数。
例如:
输入:
1.5 3
输出:
2.06667 1 (牛顿迭代结果)
1.90088 2
1.87972 3
1.87939 4
1.87939 5
1.66667 1(单点弦截迭代结果)
1.96933 2
1.84938 3
1.89032 4
1.87552 5
1.88077 6
1.87889 7
1.87956 8
1.87932 9
1.87941 10
1.87938 11
1.87939 12
1.87938 13
1.66667 1(双点弦截迭代结果)
1.76613 2
1.90130 3
1.87744 4
1.87935 5
1.87939 6
1.87939 7
import mathinp = input().split(' ')
x0 = float(inp[0])
x1 = float(inp[1])
e=0.00001def f(x):return x**3-3*x-1def f1(x):return 3*x**2-3def fai(x):return x-f(x)/f1(x)def singlefai(x,x0):return x-f(x)/(f(x)-f(x0))*(x-x0)
# x0=a# Newton
newtoncnt=0
myx=x0
while 1:temp=fai(myx)if math.fabs(temp-myx)<e:myx=tempnewtoncnt+=1breakelse:myx=tempnewtoncnt += 1print("%.5f %d" % (myx,newtoncnt))
print("%.5f %d" % (myx,newtoncnt))# print("single")
# single point
singlecnt=0
b=x1
a=x0
while 1:if math.fabs(b-singlefai(b,a))<e:b+=esinglecnt += 1breakelse:b=singlefai(b,a)singlecnt+=1print("%.5f %d" % (b,singlecnt))
print("%.5f %d" % (b,singlecnt))def doublefai(xk,x):return xk-f(xk)/(f(xk)-f(x))*(xk-x)
# xk=b,x=a# double point
#print("double point")
doublecnt=0
b=x1
a=x0
myx=2 # ? not sure
while 1:if math.fabs(doublefai(b,a)-myx)<e:myx=doublefai(b,a)doublecnt += 1breakelse:myx=doublefai(b,a)a=bb=myxdoublecnt+=1print("%.5f %d" % (myx,doublecnt))
print("%.5f %d" % (myx,doublecnt))
【计算方法】非线性方程和优化相关推荐
- 优化物理和机器学习之间的协同作用
来源:ScienceAI本文约1500字,建议阅读5分钟 虽然神经网络的最初灵感来自生物学,但物理学的见解帮助神经网络变得可用.物理学和机器学习之间的新联系产生了强大的计算方法. 机器学习和物理学有着 ...
- Oracle中的优化器--CBO和RBO
Oracle中的优化器--CBO和RBO Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的 ...
- 作为学科的计算机科学(COMPUTING AS A DISCIPLINE)
Peter J.Denning(主席)Douglas E.Comer,David Gries, Michael C.Mulder,A1len Tucker,A.Joe Turner,and Paul ...
- 作为学科的计算科学(上、中、下)
作为学科的计算科学 Peter J.Denning(主席)Douglas E.Comer,David Gries, Michael C.Mulder,A11en Tucker,A.Joe Turner ...
- Swin Transformer V2!MSRA原班人马提出了30亿参数版本的Swin Transformer!
关注公众号,发现CV技术之美 [写在前面] 在本文中,作者提出了将Swin Transformer缩放到30亿个参数的技术 ,并使其能够使用高达1536×1536分辨率的图像进行训练.通过扩大容量和分 ...
- ICCV 2019 | 微软开源跨视图融合的3D人体姿态估计算法,大幅改进SOTA精度
点击我爱计算机视觉标星,更快获取CVML新技术 今天跟大家分享一篇来自微软亚洲研究院新出并已经开源的3D姿态估计的文章:Cross View Fusion for 3D Human Pose Esti ...
- 三个关键词,看懂AI未来趋势丨不仅仅是高薪
关键词一:趋势 根据2019年<新一代人工智能产业白皮书>中的数据显示:2022年全球新一代人工智能产业规模将超过1630亿美元,我国人工智能产业将逼近300亿美元. 关键词二:人才缺口 ...
- 初探强化学习(7)基于模型的强化学习的应用综述
本文是直接翻译一篇文章的,我先把原文地址放在这里. 原文名字为:Survey of Model-Based Reinforcement Learning: Applications on Roboti ...
- “我在用生命送快递”
点击蓝字 关注我们 上海街头一名美团快递员 编辑:Jhonny 现实中的快递员,远非像营销广告中展现的那样光鲜亮丽. 31岁的快递员小李皮肤晒得黝黑,骨瘦如柴.过去10年里,他一直骑着电动自行车在上海 ...
最新文章
- 【怎样写代码】实现对象的复用 -- 享元模式(二):解决方案
- 日积月累真的很可怕,记住这些编程单词,两周学会敲代码
- MOTO行货如此服务——服务的南北差异
- 区块链BaaS云服务(16)天德链TDBC“金丝猴链”
- 服务器搭建:3.1、openresty图片压缩之GraphicsMagick
- html图片怎么设置悬浮效果,图片漂浮效果js实现
- 常见的异步方式async 和 await
- Spring Data JPA: 实现自定义Repository
- 工作流Activiti5.13学习笔记(一)
- gwt CellTable中的控件按Tab键切换
- java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串...
- eclipse中常见快捷键
- POJ 3178 凸包+DP (巨坑)
- Word里面的大括号怎么打出来?
- 计算机应用班级口号,适用于班级的口号大全
- 液晶显示屏简介以及与CRT显示屏的对比
- uva 10118 - Free Candies(记忆化搜索)
- taglist 修复中文路径的问题
- 电商运营的要点有哪些
- 计算机专业应届毕业生有没有必要参加IT培训?
热门文章
- NANK南卡降噪耳机和华为耳机哪个好?500元档最值得入手的降噪耳机
- Alfresco的Java入门开发
- access团员人数公式_2012年计算机二级Access第三十二套上机试题及答案详解
- linux7 openldap,centos7 openldap主从部署安装
- Unity尝试制作王者荣耀(十六)——FightScene(六)小地图以及英雄显示设置
- 小满Vue3第三十九章(Vue开发桌面程序Electron)
- 量化投资中的因子逻辑是什么?该如何实现?
- Linux 服务器上建立用户并分配权限
- 接水问题(贪心算法)
- direct wifi 投屏_wlan直连怎么投屏