#!/bin/python3
# -*-coding:utf-8 -*-
import math
import numpy as np #定义一个欧拉算法的类,从而实现不同步长的引用
class Euler:
y_list=[] #定义一个空列表来实现y值的存储
def __init__(self, h=0.1, y0=1,): #初始化Euler类的方法
self.h = h
self.y0 = y0
self.y = y0
self.n = 1/h
self.y_list = Euler.y_list def euler(self, y0, h,): #定义Euler算法的过程
x = 0
y = y0
n = 1/h
for i in range(int(self.n+1)):
y_dere = 1 + math.log(x + 1)
y += self.h * y_dere
self.y_list = Euler.y_list.append("%.10f" % y) # print("%.3f" % x, "%.10f" % y)
x += self.h
# print(Euler.y_list,)
return np.linspace(0, 1, n+1,dtype=float), Euler.y_list #为了引用结果列表,从而返回两个列表 #定义一个实现龙格库塔方法
class RungeKutta:
y_list = [] #同理,设置一个空列表来储存y值
def __init__(self, h=0.1, y0=1,):
self.h = h
self.y0 = y0 def make_ks(self, x_k,y_k): def y_ders(x_k):
y_der = 1 + math.log(x_k + 1)
return y_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)
return x_k, y_k def make(self, h, y0):
n = int(1/self.h)
y_k = y0
x_k = 0
for i in range(n): #用循环遍历来实现y值的计算
x_k, y_k = self.make_ks(x_k,y_k)
x_k += h
# print("%.3f" % x_k, "%.10f" % y_k)
RungeKutta.y_list.append("%.10f" % y_k) return np.linspace(0, 1, 1/h+1, dtype=float), RungeKutta.y_list #下面将收集计算的值,首先输出Euler法,再输出rungkutta,x,y数据的顺序是:x,y
print("Euler", "h=0.1")
a1 = Euler()
ax1, ay1 = a1.euler(h=0.1, y0=1)
print(ax1, "\n", ay1)
print("----------------------------------------------------------------------------")
print("Euler", "h=0.1")
print("h=0.01")
a2 = Euler()
ax2, ay2 = a2.euler(h=0.01, y0=1)
print(ax2, "\n", ay2)
print("----------------------------------------------------------------------------")
print("Euler", "h=0.1")
print("h=0.2")
a3 = Euler()
ax3, ay3 = a3.euler(h=0.2, y0=1)
print(ax3, "\n", ay3)
print("----------------------------------------------------------------------------") print("Rungkutta", "h=0.2")
c1 = RungeKutta(h=0.2, y0=1)
cx1, cy1 = c1.make(h=0.2, y0=1)
print(cx1, "\n", cy1)
print("-----------------------------------------------------------------------------") print("Rungkutta", "h=0.1")
c2 = RungeKutta(h=0.1, y0=1)
cx2, cy2 = c2.make(h=0.1, y0=1)
print(cx2, "\n", cy2)
print("-----------------------------------------------------------------------------") print("Rungkutta", "h=0.01")
c3 = RungeKutta(h=0.01, y0=1)
cx3, cy3 = c3.make(h=0.01, y0=1)
print(cx3, "\n", cy3)
print("-----------------------------------------------------------------------------")

以上的代码是实现算法的过程,以及输出的部分,还可以加入自定义的文件读取的办法,以及其他存储方式保存数据结果。

》》》》》》》》》》》》》》》》》》》》》》

程序2.0版本:

》》》》》》》》》》》》》》》》》》》》》》

# -*-coding:utf-8 -*-
import math
import numpy as np
import matplotlib.pyplot as plt # 定义一个欧拉算法的类,从而实现不同步长的引用 class Euler:
# 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 = 0 def 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 # 为了引用结果列表,从而返回两个列表 # 定义一个实现龙格库塔方法
class RungeKutta: def __init__(self, h, y0=1):
self.h = h
self.y0 = y0 def make_ks(self, x_k, y_k):
def y_ders(x_k):
y_der = 1 + math.log(x_k + 1)
return y_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)
return x_k, y_k def make(self):
n = int(1 / self.h)
y_k = self.y0
x_k = 0
for 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_list class Plots:
def __init__(self, x, y, title):
self.x = list(x)
self.y = list(y)
self.title = title def plots(self):
plt.figure(figsize=(8, 4))
plt.scatter(self.x, self.y, label="y'=1+ln(x+1),\ny0=1\n(0<x<=1) ", color="red", linewidth=2)
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__":
while True:
name = input("本程序提供Euler算法和Rungekutta算法\n选择算法时输入exit退出\n请输入需要的算法名:")
try:
a = float(input("请输入所需要的h值:"))
if a =="exit" or a=="Exit":
break
except ValueError 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 in range(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值")
del l1, 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 in range(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值")
del l2, l2p
elif name =="exit":
break
else:
print("请输入正确的算法名!!!!")

加入了退出和写入到文件的功能

用python面向对象的方法实现欧拉算法和龙格库塔算法的更多相关文章

  1. Python 面向对象 特殊方法(魔法方法)

    Python 的特殊方法,两边带双下划线的方法. 比如:__init__(self, ...).__del__(self) 1.__init__(self,...) : 构造方法 __init__(s ...

  2. python面向对象魔术方法补充

    一.描述符 在 面向对象 编程中 定义一个(没有定义方法)类:class person , 在这个类里面,有name,age, heigth, weight,等等属性, 这个类就可以看作一个对 per ...

  3. Python面向对象-定制方法

    Python中的class可以定义许多定制方法,可以让我们方便的生成特定的类. 我们之前介绍了__slots__.__len__(),python中还有许多这样的特殊函数: __str__ >& ...

  4. Python面向对象之方法

    普通方法要执行类里面的方法是通过对象触发的 触发的时候把自己赋值给self 类方法 vim day7-7.py #!/usr/bin/python # -*- coding:utf-8 -*- cla ...

  5. python 面向对象 析构方法

    实例化但从来没有调用他,就浪费了,就应该自动删除它 这个实例一直存在内存里 python有个垃圾自动回收机制 , 每段时间会自动刷新整个内存,把内存垃圾东西删除   析构函数: 在实例释放.销毁的时候 ...

  6. python面向对象-1方法、构造函数

    类是指:描述一种事物的定义,是个抽象的概念 实例指:该种事物的一个具体的个体,是具体的东西 打个比方: “人”是一个类.“张三”是人类的一个具体例子 在编程时也是同样的道理,你先自己定义一个“类”,当 ...

  7. [Python]python面向对象 __new__方法及单例设计

    __new__ 方法 使用 类名() 创建对象时,Python 的解释器 首先 会 调用 __new__ 方法为对象 分配空间 __new__ 是一个 由 object 基类提供的 内置的静态方法,主 ...

  8. Python面向对象 | 鸭子方法

    鸭子类型 如果看起来像.叫声像而且走起路来像鸭子,那么它就是鸭子’.python程序员通常根据这种行为来编写程序.例如,如果想编写现有对象的自定义版本,可以继承该对象,也可以创建一个外观和行为像,但与 ...

  9. python面向对象--item方法

    class Foo: def __getitem__(self, item): print("getitem") return self.__dict__[item] def __ ...

随机推荐

  1. 自己封装的AJAX (带JSON)

    最简单的封装的AJAX: function myajax(url,onsuccess,fail){ //确定是否支持xhr var xhr = new XMLHttpRequest ? new XML ...

  2. [转载]python datetime处理时间

    Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime.time模块我在之前的文章已经有所介绍,它提供 的接口与C标准库time.h基本一致.相比于time模块 ...

  3. SpringBoot JPA 中无法注入 JpaRepository 接口的问题及解决方案

    错误: 在Springboot  框架中使用JPA的过程中,怎么来实现数据库操作底层的交互呢?Spring JPA其实已经提供了一套很全面的解决方案,实现对数据库的增.删.查.改只需要继承JPA实现类 ...

  4. 删除pool error的解决方法

    标签(空格分隔): ceph,ceph运维,pool 问题描述: 删除pool的时候提示下面的错误: [root@node3 ~]# ceph osd pool delete ecpool ecpoo ...

  5. #define和const的区别

    下面使用#define和const定义常量: #define n_define 10 int main(int argc, char* argv[],int _version) { ; int *p= ...

  6. 程序中使用log4J打印信息的两种方式

    (1)通过org.apache.commons.logging.Log 接口实例化: public static Log log = LogFactory.getLog(String name); p ...

  7. WPF TextBox 一些设置技巧

    WPF TextBox 一些设置技巧 运行环境:Win10 x64, NetFrameWork 4.8, 作者:乌龙哈里,日期:2019-05-01 参考: 章节: 取消输入法 输入方式设定为Over ...

  8. java之控制多幅图片

    package xxj.thread0904; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JFra ...

  9. AudioManager 音量『转』

    获取系统音量 通过程序获取android系统手机的铃声和音量.同样,设置铃声和音量的方法也很简单! 设置音量的方法也很简单,AudioManager提供了方法: publicvoidsetStream ...

  10. PL/SQL批处理语句(一)BULK COLLECT

    我们知道PL/SQL程序中运行SQL语句是存在开销的,因为SQL语句是要提交给SQL引擎处理,这种在PL/SQL引擎和SQL引擎之间的控制转移叫做上下文却换,每次却换时,都有额外的开销.然而,FORA ...