Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Очень интересно! ии сайт крутой жалко что умирает(
У Вас число превысит максимальное число int. Можно использовать в Вашем случае uint, но лучше все переписать на double.
Добавление к программе строки glutReshapeFunc(changeSize); приводит к тому, что треугольник перестаёт совсем отрисовываться.
Выдаёт ошибку glut32.dll не найден! При том, что он лежит в System32! Всё решил) Нужно отправить не в System32, а в System.
Спасибо за статью. Я не Ваш студент. Но мне она помогла написать функцию для Канторова множества на Python для черепашки: import turtle def kanter(x, y, d):     if d > 1:         turtle...

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Скриншот к примеру
Среда программирования: 
Brackets build 1.14.2-17770

Программа демонстрирующая интерполяцию многочленом Эрмита третьей степени
функции ƒ(x)=1/(1+(5+k)*x2)

Код программы: 

from tkinter import *
from tkinter import messagebox
from PIL import ImageTk, Image
import numpy as np
import matplotlib.pyplot as plt 
import random
 
class Application(Frame):
 
    def __init__(self,master=None):
        super().__init__(master)
        self.grid()
        self.create_widgets()
        self.master.title("Интерполяция многочленом Эрмита")
        self.master.geometry(f"650x640+50+50")
        self.master.resizable(False, False)  
 
    def create_widgets(self):
 
        left_frame = Frame(root, width=640, height=480, pady=5).grid(row=0,sticky="wens")
        right_frame = Frame(root,width=640, height=160, padx=5, pady=5)
        right_frame.grid(row=1,sticky="wens")
 
#        холст для вывода графика функции и ее апроксимации
        self.canvas = Canvas(left_frame,width=640,height=480)
        self.canvas.grid(row=0, column=0,sticky="wens", pady=5, padx=5)
 
#        ввод коэффициента k для функции                    
        Label(right_frame,text="Ввести k:",font=('Arial',10)).grid(
            row=0, column=0,sticky="w", pady=5, padx=5)
        self.parD = DoubleVar()
        Entry(right_frame,textvariable = self.parD,width=15,font=('Arial',10)).grid(
            row=0,column=1,sticky="w",padx=5,pady=5)
 
#        ввод количества интервалов разбиения
        Label(right_frame,text="Ввести количество интервалов:",font=('Arial',10)).grid(
            row=1, column=0,sticky="w", pady=5, padx=5)
        self.NumberOfIntervals = IntVar()
        Entry(right_frame,textvariable = self.NumberOfIntervals,width=15,font=('Arial',10)).grid(
            row=1,column=1,sticky="w",padx=5,pady=5)
 
#        если  переменная CheckVar = 0 равномерная сетка, случайные абсциссы иначе
        self.CheckVar= IntVar()
        R1 = Checkbutton(right_frame, text = "Случайное разбиение", variable = self.CheckVar, onvalue = 1, offvalue = 0).grid(row=2,column=0,sticky="we",padx=5,pady=5,columnspan=2)
#        кнопка для вывода графика
        Button(right_frame,text="Расчитать",font=('Arial',10),command=lambda: self.calc()).grid(
            row=3,column=0,columnspan=2, stick="we",padx=5,pady=5)
 
#    метод для вычисления интерполяционного многочлена эрмита на передаваемом отрезке
    def ermite(self,Ax,Ay,Bx,By,prA,prB): 
        xe=np.arange(Ax,Bx+0.01,0.01)
        h=Bx-Ax
        fxde=[]
        for xde in xe: 
            koef=(xde-Ax)/h
            h3=(1-3*(koef**2)+2*(koef**3))*Ay+(3*(koef**2)-2*(koef**3))*By+(koef-2*(koef**2)+(koef**3))*prA*h+(-(koef**2)+(koef**3))*prB*h
            fxde.append(h3)
#        возвращаем два списка с координатами точек по эрмиту
        return xe,fxde
 
    def calc(self):
#        получаем коээф. k
        k=self.parD.get()
#        получаем разбиения
        n=self.NumberOfIntervals.get()
#        проверка, что интервал не нулевой
        if n == 0: 
            messagebox.showwarning(title="Неверное значение", message="Введите количество интервалов больше 0")
            return
        xi=[]
#        равномерная сетка, если не выбранно обратное
        if self.CheckVar.get() == 0: 
            for i in range(0,n+1): 
                xi.append(-1+i*(2/n))
        else: 
            for i in range(0,n+1): 
                xi.append(random.uniform(-1,1))
#            поскольку точки случайные, для корректного счета сортируем
            xi.sort()
        fxi=[]
        prxi=[]
 
#        вычисляем значение функции и производной в точках разбиения
        for xd in xi: 
            fxi.append(1/(1+(5+k)*(xd**2)))
            prxi.append(-(2*(k+5)*xd)/((k+5)*(xd**2)+1)**2)
 
#        попарно передаем точки, производные в точках и значения функции в метод вычисляющий многочлен эрмита
#        полученные два списка наносим на график
        for i in range(len(xi)-1):  
            x,y=self.ermite(xi[i],fxi[i],xi[i+1],fxi[i+1],prxi[i],prxi[i+1])
            plt.plot(x,y)
            plt.plot(xi[i],fxi[i],'o')
            plt.plot(xi[i+1],fxi[i+1],'o')
 
#        на отрезке [-1,1] находим абсциссы и ординаты для отображения иходного графика функции
        xfunc=np.arange(-1,1+0.01,0.01)
        yfunc=(1/(1+(5+k)*(xfunc**2)))
        plt.plot(xfunc,yfunc, color="gray",alpha=0.5,label='f(x)=1/(1+(5+k)*x^2)')
        plt.legend()
#        сохраняем картинку с графиками
        plt.savefig("ermite.png")
#        вызываем функцию загрузки картинки
        image = self.load_image("ermite.png")
#        выводим на холст картинку
        self.set_image(image)
#        очищаем все что было на графике
        plt.clf()
#    метод загрузки изображения
    def load_image(self,name):
        img = Image.open(name)
        return ImageTk.PhotoImage(img)
#    метод установки изображения на холст     
    def set_image(self,image):
        self.canvas.delete("all")
        self.canvas.image = image
        self.canvas.create_image(0,0,image= self.canvas.image,anchor='nw')
 
root = Tk()
app = Application(master=root)
root.mainloop()

Прикрепленный файлРазмер
tsybrik_example_ermite.rar2.13 кб