Программа для расчета матрицы состояния

artgor

Новичок
Пользователь
Янв 11, 2023
9
0
1
мне нужно доработать программу, чтобы при повторном старте программы она предлагала изменить, или оставить без изменений введенные до этого данные.


Код:
#подключаем библиотеки
from scipy import linalg     
import numpy as np
import matplotlib.pyplot as plt

def vvod_m():           #создаем Функцию ввода матрицы
    
    matrica=[]
    i=0
    while i>-1:
        matrica.append(input().split())
        end=matrica[i][0]
        if end == ".":
            break
        i+=1
    raw=len(matrica)-1
    _ = matrica.pop(raw)                  # Удаляем строку в матрице

    for i in range(len(matrica)):         # len(A) - возвращает количество строк в матрице А
        for j in range(len(matrica[i])):  # len(A[i]) - возвращает количество элементов в строке i
            matrica[i][j]=float(matrica[i][j])
    matrica=np.array(matrica)
    return matrica

def grafiki(mat,mat2):
    x1=0
    for cp in range(len(mat)):
        for s in range(len(mat[c])):
            x1=x1+1
    x1=np.arange(x1)
    mat = np.concatenate(mat).flat   
    mat = np.array(mat)
    x2=x1.copy()
    
    
    x1=0
    for cp in range(len(mat2)):
        for s in range(len(mat2[c])):
            x1=x1+1
    x1=np.arange(x1)
    mat2 = np.concatenate(mat2).flat   
    mat2 = np.array(mat2)
    plt.plot(x2,mat,label='line A2')
    plt.plot(x1,mat2,label='line B2')
    plt.legend()
    plt.show()
    

def vivod(matrica):          #создаем функцию вывода матрицы
  
    for i in range(len(matrica   )):         # len(A) - возвращает количество строк в матрице А
        for j in range(len(matrica   [i])):  # len(A[i]) - возвращает количество элементов в строке i
            print(matrica   [i][j], end = ' ')
        print()                     # делаем переход на новую строку





c=1
while c==1:
    print("Введите матрицу A по строкам:")      #Вводим матрицу А
    A=vvod_m()
    print("Введите нулевой вектор Y по строкам:")   #Вводим нулевой вектор Y0
    Y0=vvod_m()
    print("Введите пеpиод дискретизации")      #Вводим период дискретизации  dt
    dt=float(input())
    print("Введите время наблюдения:")         #Вводим время наблюдения t
    t=float(input())
    print("количество столбцов для расчета")
    k=int(input())
    print("Введите матрицу B:")
    B=vvod_m()
    print("Введите нулевой вектор U:")
    U0=vvod_m()
    print("Введите величину отклонения вектора управления:")
    DU=vvod_m()

    U1=U0.copy()
    i=0           #переменная числа повторений цикла
    it=int(t/dt)  #количество периодов дискретизации
    Y=Y0.copy()  #Присваиваем матрице векторов значение нулевого векторв
    A=np.hstack((A,B))
    vivod(A)
    Y0=np.vstack((Y0, U0))
    Yi1=Y0
    while i < it:     # Каждый период дискретизации считаем матрицу векторов
        # Присваиваем предыдущему вектор-столбцу значение текущего
        print("произведение столбца на матрицу:")
        Yi=np.matmul( A,Y0 )                    # Умножаем матрицу А на предыдущий вектор
        U1=U0+DU
        U0=U1
        print("Yi")
        vivod(Yi)            #Выводим текущий вектор
        Y=np.hstack((Y,Yi))    # добавляем вектор к предыдущей
        print("Y")
        vivod(Y)
        for j in range(len(Y[0])):
            if k == j:
                Y=np.delete(Y,[0],axis=1)
                print("i")
                print(i)
                vivod(Yi1)
                Y1 = linalg.pinv(Yi1)
                Yi1=np.delete(Yi1,[0],axis=1)
                print("Псевдообратная")
                vivod(Y1)
                print("")
                print("Произведение Y  и псевд")
                A1=np.matmul( Y,Y1 )
                vivod(A1)
                A2=np.delete(A1,np.s_[len(Yi):len(Yi)+len(U0)],axis=1)
                B2=np.delete(A1,np.s_[0:len(Yi)],axis=1)
                print("A2")
                vivod(A2)
                print("B2:")
                vivod(B2)
                print("Собственные числа матрицы А2:")
                val, vect  = linalg.eig(A2)
                print(val)

        Y0=np.vstack((Yi, U0))
        Yi1=np.hstack((Yi1,Y0))
        i+=1
    grafiki(A2,B2)
    print("Продолжить работу? Да(1)/Нет(0)")
    c=int(input())
    if c==0:
        break



чтобы данные можно было изменять (не переписывать, а именно редактировать)
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 580
457
83
не переписывать, а именно редактировать
как вы себе это представляете в консоли?
 

artgor

Новичок
Пользователь
Янв 11, 2023
9
0
1
чтобы пользователю предложили изменить введенные до этого данные и когда он наводит курсор на какой-либо элемент матрицы, выделяет его и вводит другое число
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 580
457
83
чтобы пользователю предложили изменить введенные до этого данные и когда он наводит курсор на какой-либо элемент матрицы, выделяет его и вводит другое число
в консоли? вы где то видели такой консольный интерфейс?
 

artgor

Новичок
Пользователь
Янв 11, 2023
9
0
1
Надо сделать так, чтобы при вводе матриц программа проверяла на некорректность ввода и просила ввод ещё раз, может кто-то помочь?
 

Форум IT Специалистов