python龙格库塔_用python面向对象的方法实现欧拉算法和龙格库塔算法

该博客介绍了如何使用Python面向对象编程实现欧拉算法和四阶龙格-库塔方法。通过创建Euler和RungeKutta类,分别实现了两种数值解法,并给出了具体代码示例。同时,还提供了可视化类Plots用于绘制解法的图形输出。
摘要由CSDN通过智能技术生成

#-*-coding:utf-8 -*-

importmathimportnumpy as npimportmatplotlib.pyplot as plt#定义一个欧拉算法的类,从而实现不同步长的引用

classEuler:#y_list = [] # 定义一个空列表来实现y值的存储

def __init__(self, h, y0): #初始化Euler类的方法

self.h =h

self.y0=y0

self.y=y0

self.n= 1 /self.h

self.x=0def euler(self): #定义Euler算法的过程

#x = 0

#y = self.y0

#n = 1 / self.h

for i in range(int(self.n + 1)):

y_dere= 1 + math.log(self.x + 1)

self.y+= self.h *y_dere

self.y_list= Euler_y_list.append("%.10f" %self.y)

self.x+=self.h#print(Euler.y_list,)

return np.linspace(0, 1, self.n + 1, dtype=float), Euler_y_list #为了引用结果列表,从而返回两个列表

#定义一个实现龙格库塔方法

classRungeKutta:def __init__(self, h, y0=1):

self.h=h

self.y0=y0defmake_ks(self, x_k, y_k):defy_ders(x_k):

y_der= 1 + math.log(x_k + 1)returny_der#计算K1,K2,K3,K4

k1 =y_ders(x_k)

k2= y_ders(x_k + self.h / 2)

k3= y_ders(x_k + (self.h / 2))

k4= y_ders(x_k +self.h)

y_k= y_k + self.h / 6 * (k1 + (2 - math.sqrt(2)) * k2 + (2 + math.sqrt(2)) * k3 +k4)returnx_k, y_kdefmake(self):

n= int(1 /self.h)

y_k=self.y0

x_k=0for i in range(n): #用循环遍历来实现y值的计算

x_k, y_k =self.make_ks(x_k, y_k)

x_k+=self.h

RungeKutta_y_list.append(y_k)return np.linspace(0, 1, n+1, endpoint=True,dtype=float), RungeKutta_y_listclassPlots:def __init__(self, x, y, title):

self.x=list(x)

self.y=list(y)

self.title=titledefplots(self):

plt.figure(figsize=(8, 4))

plt.scatter(self.x, self.y, label="y'=1+ln(x+1),\ny0=1\n(0

plt.xlabel("x")

plt.ylabel("y")

plt.title(self.title)#plt.ylim(min(self.y), max(self.y))

plt.ylim()

plt.legend()

plt.show()if __name__ == "__main__":whileTrue:

name= input("本程序提供Euler算法和Rungekutta算法\n选择算法时输入exit退出\n请输入需要的算法名:")try:

a= float(input("请输入所需要的h值:"))if a =="exit" or a=="Exit":break

exceptValueError as ve:print(ve)if name == "Euler":

Euler_y_list=[]

l1= Euler(h=a, y0=1)

l1x, l1y=l1.euler()

with open("Euler.txt","a+") as f:

f.write("h=%s\n" %l1.h)

f.write("x值--------------y值\n")for i inrange(len(l1x)):print("x是:%.5f y是:%.10f" %(float(l1x[i]),float(l1y[i])))

a,b=str(l1x[i]),str(l1y[i])

f.write(a+" "*6+b+"\n")

l1p=Plots(l1x, l1y, name)

l1p.plots()print("请储存好你的x值,和y值")dell1, l1p, l1x, l1y

Euler.y_list=[]elif name == "Rungekutta":

RungeKutta_y_list=[0]

l2= RungeKutta(h=a)

l2x, l2y=l2.make()

with open("Rungekutta.txt", "a+") as f:

f.write("h=%s\n" %l2.h)

f.write("x值--------------y值\n")for i inrange(len(l2x)):print("x是:%.5f y是:%.10f" %(l2x[i], l2y[i]))

a, b=str(l2x[i]), str(l2y[i])

f.write(a+ " " * 6 + b + "\n")

l2p=Plots(l2x, l2y, name)

l2p.plots()print("请储存好你的x值,和y值")dell2, l2pelif name =="exit":break

else:print("请输入正确的算法名!!!!")

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值