На главную страницу RastrWin

Форум «Макро»


Список форумов
Новые темы
Список тем
Поиск по форумам
Помощь
Войти
Регистрация


Тема: «Заполнение массива найденными данными » в форуме: Макро   Просмотров: 2946
 
Матвей Матюшин
Заглянувший
 
Всего сообщений: 7
Дата регистрации: 26.05.2023
Создано: 01.06.2023 00:42:36
 
 
Здравствуйте! Помогите, пожалуйста. Из макроса матрицы Якоби для каждого узла вытащил собственные проводимости. Подскажите, как можно создать массив данных неизвестной размерности и заполнить его этими полученными проводимостями, чтобы потом с ними можно было работать (сортировать, сравнивать и тд)?

Только начинаю с макросами работать, в примерах и уроках не нашёл подобного =(
 
Профиль
Наверх
Матвей Матюшин
Заглянувший
 
Всего сообщений: 7
Дата регистрации: 26.05.2023
Создано: 01.06.2023 16:15:38
 
 
prdir=Rastr.SendCommandMa­in(3,"","",0) ' директория Rastr -ActOpus
shabl=prdir&"SHABLON\"&"м­атрица якоби.mc" ' Шаблон таблицы соответствия
Rastr.NewFile shabl
Rastr.JAkobi ""

set Jakobi=Rastr.Tables("jako­bi")
set yzel_i=Jakobi.Cols("ni")
set yzel_j=Jakobi.Cols("nj")
set dp_dv=Jakobi.Cols("b")
Rastr.printp "Узел_I Узел_J DP/dV"
for i=0 to Jakobi.Size-1
Rastr.Printp yzel_i.Z(i) & " " &yzel_j.Z(i)& " "&dp_dv.Z(i)

next
 
Профиль
Наверх
Матвей Матюшин
Заглянувший
 
Всего сообщений: 7
Дата регистрации: 26.05.2023
Создано: 02.06.2023 00:10:53
 
 
prdir=Rastr.SendCommandMa­in(3,"","",0) ' директория Rastr -ActOpus
shabl=prdir&"SHABLON\"&"м­атрица якоби.mc" ' Шаблон таблицы соответствия
Rastr.NewFile shabl
Rastr.JAkobi ""

set Jakobi=Rastr.Tables("jako­bi")
set yzel_i=Jakobi.Cols("ni")
set yzel_j=Jakobi.Cols("nj")
set dp_dv=Jakobi.Cols("b")

Dim array1(100, 2), j
j = 0
dim array_r(100, 2)
k = 0
dim t, m

for i = 0 to Jakobi.Size-1
if yzel_i.Z(i) = yzel_j.Z(i) and yzel_i.Z(i) <> 0 then
array1(j, 0) = yzel_i.Z(i) 'находим узел i
array1(j, 1) = dp_dv.Z(i) ' присваиваем узлу его собственную проводимость
j = j + 1
end if
next

for i = 0 to Jakobi.Size-1
if yzel_i.Z(i) <> yzel_j.Z(i) then
t = 0
m = yzel_i.Z(i)
for each x in array1
Rastr.printp array1(t, 0) 'если узел j отличается от i
if x = m then
array1(t, 2) = array1(t, 2) - dp_dv.Z(i) 'вычитаем из собственной проводимости взаимную
end if
t = t + 1
Rastr.printp t
exit for
next
t = 0
array_r(k, 1) = array1(t, 1) - dp_dv.Z(i)
array_r(k, 0) = yzel_i.Z(i)
k = k + 1
end if
next
 
Профиль
Наверх
Матвей Матюшин
Заглянувший
 
Всего сообщений: 7
Дата регистрации: 26.05.2023
Создано: 02.06.2023 00:13:51
 
 
Происходит зацикливание, при выводе узел не меняется и равен n, а параметр t равен 1. Помогите, пожалуйста, в чём кроется ошибка?
 
Профиль
Наверх
Даниил Теплухин
Заглянувший
 
Всего сообщений: 2
Дата регистрации: 02.06.2023
Создано: 02.06.2023 11:56:43
 
 
Здравствуйте, у вас в коде в цикле for each метод exit for заставляет программу выйти из цикла, в связи с чем и получается так что t сначала равно нулю, после увеличивается на 1, и затем происходит выход из цикла, после него t приравнивается к нулю, в связи с чем у вас t постоянно меняет значение с 0 на 1 и и обратно и выводится значение t=1.
Цитата

for each x in array1
Rastr.printp array1(t, 0) 'если узел j отличается от i
if x = m then
array1(t, 2) = array1(t, 2) - dp_dv.Z(i) 'вычитаем из собственной
проводимости взаимную
end if
t = t + 1
Rastr.printp t
exit for
next

 
Профиль
Наверх
Матвей Матюшин
Заглянувший
 
Всего сообщений: 7
Дата регистрации: 26.05.2023
Создано: 02.06.2023 13:31:31
 
 
Спасибо огромное! Попробовал исправить, теперь t изменяются. У меня всего 25 узлов, но он увеличивается до предела размерности матрицы, даже когда узлы закончились. Я не силён в программировании, но подскажите, в чём сейчас моя промашка?

prdir=Rastr.SendCommandMa­in(3,"","",0) ' директория Rastr -ActOpus
shabl=prdir&"SHABLON\"&"м­атрица якоби.mc" ' Шаблон таблицы соответствия
Rastr.NewFile shabl
Rastr.JAkobi ""

set Jakobi=Rastr.Tables("jako­bi")
set yzel_i=Jakobi.Cols("ni")
set yzel_j=Jakobi.Cols("nj")
set dp_dv=Jakobi.Cols("b")

Dim array1(50, 2), j
j = 0
dim array_r(50, 2)
k = 0
dim t, m

Rastr.printp "Узел_I Узел_J DP/dV"
for i = 0 to Jakobi.Size-1
if yzel_i.Z(i) = yzel_j.Z(i) and yzel_i.Z(i) <> 0 then
array1(j, 0) = yzel_i.Z(i)
array1(j, 1) = dp_dv.Z(i)
j = j + 1
end if
next

for i = 0 to Jakobi.Size-1
if yzel_i.Z(i) <> yzel_j.Z(i) then 'если узлы не равны
t = 0
m = yzel_i.Z(i)
for each x in array1
Rastr.printp array1(t, 0)
if x <> m then 'тогда из собственной проводимости отнять взаимную
array1(t, 2) = array1(t, 2) - dp_dv.Z(i)
end if
t = t + 1
Rastr.printp t
next
array_r(k, 1) = array1(t, 1) - dp_dv.Z(i)
array_r(k, 0) = yzel_i.Z(i)
k = k + 1
end if
next

for i = 0 to UBound(array1)
Rastr.Printp array1(i,0) & " " & array1(i,2)
next
 
Профиль
Наверх
Даниил Теплухин
Заглянувший
 
Всего сообщений: 2
Дата регистрации: 02.06.2023
Создано: 08.06.2023 11:11:35
 
 
Здравствуйте!

1. В матрице Якоби используются частные производные,
из них выразить проводимости не представляется возможным.

2. То что у вас t уходит за предел массива array рассчитанного на 50 элементов, волне возможно,
что матрица Якоби больше по размерности, т.е. там кроме узлов могут учитываться и ветви
(возможно, но не точно, т.к. принцип работы конкретно этой таблицы был запрограммирован очень давно,
и не представляется возможным найти точную информацию о её устройстве).
Я проверил на другой схеме, где количество узлов - 197, в данном случае Jacobi.Size выдало значение 731,
возможно и в вашем случае элементов так же больше 25 или 50.

3. Могу вам посоветовать обратить внимание на то, что в таблице jacobi[] присутствуют колонки с проводимостями G и B,
возможно это то что вы ищите, но опять стоит учесть ситуацию описанную в предыдущем пункте.
 
Профиль
Наверх



Читают тему
гостей: 1, пользователей: 0, из них скрытых: 0


Список форумов
Новые темы
Список тем
Поиск по форумам
Помощь
Войти
Регистрация





Работает на «Битрикс: Управление сайтом» © «Битрикс», 2001-2006