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))

【计算方法】非线性方程和优化相关推荐

  1. 优化物理和机器学习之间的协同作用

    来源:ScienceAI本文约1500字,建议阅读5分钟 虽然神经网络的最初灵感来自生物学,但物理学的见解帮助神经网络变得可用.物理学和机器学习之间的新联系产生了强大的计算方法. 机器学习和物理学有着 ...

  2. Oracle中的优化器--CBO和RBO

    Oracle中的优化器--CBO和RBO Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的 ...

  3. 作为学科的计算机科学(COMPUTING AS A DISCIPLINE)

    Peter J.Denning(主席)Douglas E.Comer,David Gries, Michael C.Mulder,A1len Tucker,A.Joe Turner,and Paul ...

  4. 作为学科的计算科学(上、中、下)

    作为学科的计算科学 Peter J.Denning(主席)Douglas E.Comer,David Gries, Michael C.Mulder,A11en Tucker,A.Joe Turner ...

  5. Swin Transformer V2!MSRA原班人马提出了30亿参数版本的Swin Transformer!

    关注公众号,发现CV技术之美 [写在前面] 在本文中,作者提出了将Swin Transformer缩放到30亿个参数的技术 ,并使其能够使用高达1536×1536分辨率的图像进行训练.通过扩大容量和分 ...

  6. ICCV 2019 | 微软开源跨视图融合的3D人体姿态估计算法,大幅改进SOTA精度

    点击我爱计算机视觉标星,更快获取CVML新技术 今天跟大家分享一篇来自微软亚洲研究院新出并已经开源的3D姿态估计的文章:Cross View Fusion for 3D Human Pose Esti ...

  7. 三个关键词,看懂AI未来趋势丨不仅仅是高薪

    关键词一:趋势 根据2019年<新一代人工智能产业白皮书>中的数据显示:2022年全球新一代人工智能产业规模将超过1630亿美元,我国人工智能产业将逼近300亿美元. 关键词二:人才缺口 ...

  8. 初探强化学习(7)基于模型的强化学习的应用综述

    本文是直接翻译一篇文章的,我先把原文地址放在这里. 原文名字为:Survey of Model-Based Reinforcement Learning: Applications on Roboti ...

  9. “我在用生命送快递”

    点击蓝字 关注我们 上海街头一名美团快递员 编辑:Jhonny 现实中的快递员,远非像营销广告中展现的那样光鲜亮丽. 31岁的快递员小李皮肤晒得黝黑,骨瘦如柴.过去10年里,他一直骑着电动自行车在上海 ...

最新文章

  1. 【怎样写代码】实现对象的复用 -- 享元模式(二):解决方案
  2. 日积月累真的很可怕,记住这些编程单词,两周学会敲代码
  3. MOTO行货如此服务——服务的南北差异
  4. 区块链BaaS云服务(16)天德链TDBC“金丝猴链”
  5. 服务器搭建:3.1、openresty图片压缩之GraphicsMagick
  6. html图片怎么设置悬浮效果,图片漂浮效果js实现
  7. 常见的异步方式async 和 await
  8. Spring Data JPA: 实现自定义Repository
  9. 工作流Activiti5.13学习笔记(一)
  10. gwt CellTable中的控件按Tab键切换
  11. java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串...
  12. eclipse中常见快捷键
  13. POJ 3178 凸包+DP (巨坑)
  14. Word里面的大括号怎么打出来?
  15. 计算机应用班级口号,适用于班级的口号大全
  16. 液晶显示屏简介以及与CRT显示屏的对比
  17. uva 10118 - Free Candies(记忆化搜索)
  18. taglist 修复中文路径的问题
  19. 电商运营的要点有哪些
  20. 计算机专业应届毕业生有没有必要参加IT培训?

热门文章

  1. NANK南卡降噪耳机和华为耳机哪个好?500元档最值得入手的降噪耳机
  2. Alfresco的Java入门开发
  3. access团员人数公式_2012年计算机二级Access第三十二套上机试题及答案详解
  4. linux7 openldap,centos7 openldap主从部署安装
  5. Unity尝试制作王者荣耀(十六)——FightScene(六)小地图以及英雄显示设置
  6. 小满Vue3第三十九章(Vue开发桌面程序Electron)
  7. 量化投资中的因子逻辑是什么?该如何实现?
  8. Linux 服务器上建立用户并分配权限
  9. 接水问题(贪心算法)
  10. direct wifi 投屏_wlan直连怎么投屏