#!/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. java继承。顾不了

    总结:为什么结果显示所有数据都重复输出了呢? package com.sa; //java里的几个难以理解的概念.字节码文件.class文件.源文件 //.class文件指的是.编译后产生的字节码文件 ...

  2. 使用svn进行本地代码管理

    简述 这里讨论的是如何管理自己个人电脑的个人项目的代码.和SVN服务器配置无关. 可以先到TortoiseSVN官网下载安装包进行安装. 代码仓库管理 比如现在有一个工程需要进行管理,可以先将该工程放 ...

  3. Python命令模块argparse学习笔记(一)

    首先是关于-h/--help参数的设置 description:位于help信息前,可用于描述helpprog:描述help信息中程序的名称epilog:位于help信息后usage:描述程序的用途a ...

  4. jackson2.x与Jackson1.9的比较

    Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json.xml转换成Java对象.Jackson库于2012.10.8号发布了最新的2.1版.Jackson源码目前 ...

  5. 问题:PLS-00204: 函数或伪列 'EXISTS' 只能在 SQL 语句中使用;结果:PL/SQL中不能用exists函数?

    怎么写了一个语句带出这样的结果. 语句: if exists (select * from sysdatabases where name='omni') then 结果: ERROR 位于第 4 行 ...

  6. leetcode657

    bool judgeCircle(string moves) { ;//垂直位移 ;//水平位移 for (auto m : moves) { if (m == 'U') { V++; } else ...

  7. C++ 学习之---C++基础理论知识(也适合面试回顾)

    C++ 语言编写的基础练习 具体案例放在github中 github地址:https://github.com/Master-fd/C-Base 1. 操作符重载 2. 构造与析构 3. 函数模板 4 ...

  8. Android指针管理:RefBase,SP,WP

    Android中通过引用计数来实现智能指针,并且实现有强指针与弱指针.由对象本身来提供引用计数器,但是对象不会去维护引用计数器的值,而是由智能指针来管理. 要达到所有对象都可用引用计数器实现智能指针管 ...

  9. re.findall 两个连续匹配成功的输出后一个

  10. Apollo问题

    1.安装问题: 一不小心安装了NVIDIA,导致bash docker/scripts/dev_start.sh无法启动:[ERROR] Failed to start docker containe ...