Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 19
1
Matlab до v. 2013

Чрезмерное количество выходных аргументов функции

16.02.2018, 17:17. Показов 2558. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!

Столкнулся с проблемой, там, где не ожидал: в разработанной файл-функции Matlab почему-то слишком много выходных аргументов, поэтому она отказывается запускаться (хотя ранее встречался с информацией о том, что в MatLab нет ограничений по количеству выходных переменных).

Когда запускаю функцию при помощи ярлыка, то ПО пишет данную проблему (на 1-й картинке, ярлычок выделен зелёным цветом).

Если же вручную копирую синтаксис (тот, который "под ярлыком") в командное окно (на первом скриншоте, но ниже; синим цветом выделен текст вызова функции), то проблем с вызовом нет, всё рассчитывается, однако в конце снова высвечивается ошибка (скриншот 2). И в ошибке есть отсылка к 6-й строке файла, хотя сам код более 200 строк, т.е. это априори некорректное описание проблемы.

И ещё нюанс, когда запускаю код из отладчика M-файлов, то всё без проблем работает, но возвращает, по понятным причинам, только один выходной аргумент - "ans".

Как быть в этом случае? Неужели придётся усложнять код и "запихивать" многие выходные аргументы в матрицы и массивы с целью уменьшения их количества? Или разбивать его на несколько функций?
Я сознательно программировал "не сокращая код", т.к. сам математический алгоритм сложный, чтобы потом легко разобрался в нём при чтении.

P.S. Мне на самом деле столько аргументов на выходе и не нужно, многие из них выводятся внутри кода и используются только для промежуточных вычислений, но когда в самом скрипте начинаю удалять лишние, то при запуске выводится ошибка о том, что переменная, фигурирующая в коде, не указана в перечне выходных аргументов в заголовке функции.

P.P.S. Вызов функции в командной строке с меньшим числом выходных аргументов тоже не помогает, возвращаются числа, рассчитываемые по порядку в скрипте, а не поместившиеся в это количество (самые нужные, те, что в конце скрипта) просто "пропадают".

Заранее спасибо за помощь!
Миниатюры
Чрезмерное количество выходных аргументов функции   Чрезмерное количество выходных аргументов функции  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.02.2018, 17:17
Ответы с готовыми решениями:

Создайте функцию, которая принимает переменное количество входных аргументов и возвращает переменное количество выходных
Создайте функцию, которая принимает переменное количество входных аргументов и возвращает...

Странное расположение в памяти аргументов функции с неизвестным количество аргументов
Не могу понять, почему такая программа не работает, выдавая segmentation fault после распечатки...

Можно ли наращивать количество аргументов функции? Можно ли вернуть количество аргументов функции?
К примеру есть примитивная запись int Funk(bool Er,int q1,int q2,int q3) {return 0;} В...

Из-за подсветки в новой версии Creator не видно выходных аргументов. Как исправить?
Обновил Qt Creator. Теперь выходные аргументы отображаются вот так: Лезу в параметры, тут у...

15
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
16.02.2018, 18:34 2
Цитата Сообщение от Vitalii_Iurch Посмотреть сообщение
Я сознательно программировал "не сокращая код"
Согласен, тоже так делаю.
Цитата Сообщение от Vitalii_Iurch Посмотреть сообщение
столько аргументов на выходе и не нужно
Попробуйте описать их как глобальные и тогда их значения можно смотреть в WORKSPACE.
и после отладки опять описать их как локальные
0
6830 / 4890 / 2065
Регистрация: 02.02.2014
Сообщений: 13,048
16.02.2018, 18:37 3
без самого кода трудно дать ответ
0
0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 19
19.02.2018, 17:03  [ТС] 4
Попробуйте описать их как глобальные и тогда их значения можно смотреть в WORKSPACE.
Не совсем понял: т.е. нужно будет их прописывать в командном окне перед вызовом функции каждый раз? Проблема в том, что "руками" я могу задать значений 5-8, а высчитывается около 30. И в оставшейся части задачи будет порядка 10-15. Т.е. кардинально это проблему не решит.

P.S. А какой кнопкой нужно осуществлять цитирование с указанием автора цитируемого сообщения (как в ответе Nick07), что-то не разобрался ?

Добавлено через 4 минуты
Цитата Сообщение от Krasme Посмотреть сообщение
без самого кода трудно дать ответ
Ладно, попробую, но строчек там много...

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
%Программный код разработан для расчёта методом конечных элементов (далее-МКЭ) бетонных и железобетонных пластин и оболочек с
%применением приведённых параметров упругости (ввиду
%армирования) и учётом нелинейного поведения бетона.
function [L_con, S_con, H_con, n_el_L, n_el_S, n_el_H, L_el, S_el, H_el, V_el, A1_el, A2_el, A3_el, A4_el, n_el, el_array, n_jun, jun_array, jun_coord_array, el_loc_ind_array, Rb, Rbt, E0_con, nu0_con, lim_def_con_X, E0_arm, G0_arm, K0_arm, nu0_arm, G0_con, K0_con, hi, R2c, lim_def_con_Y, lim_def_con_Z, lim_shift_con, E0_array, G0_array, K0_array, nu0_array, n_reinf_levels, n_bars_X, n_bars_Y, n_bars_Z, d_reinf_bars, Mx_el_prop, Ni, Nj, Nk, Nl, dNi_dx, dNj_dx, dNk_dx, dNl_dx, dNi_dy, dNj_dy, dNk_dy, dNl_dy]=cover_fe_calc% указание выходных параметров функции и её наименование
 
disp ('Запущенный алгоритм предназначен для расчёта конструкций, моделируемых оболоченными элементами, методом конечных элементов с использованием переменных параметров упругости и приведённых жёсткостных характеристик материала.');% описание этапа работы функции (для удобства и наглядности)
 
disp('Блок 1: Задание и расчёт необходимых исходных данных.')% описание этапа работы функции (для удобства и наглядности)
 
disp ('Раздел 1.1: Формирование геометрии конструкции.');% описание этапа работы функции (для удобства и наглядности)
 
disp ('Принятая система координат (положительные направления осей): ось X - слева-направо, ось Y - от наблюдателя, ось Z - снизу-вверх; левый нижний угол конструкции имеет координаты (0; 0; 0).');% информационное сообщение для пояснения алгоритма расчёта
 
L_con=input('Размер конструкции по оси X (длина), мм, L_con=');% ручное задание полной длины рассчитываемой конструкции (далее - конструкция) в миллиметрах (далее - мм)
S_con=input('Размер конструкции по оси Y (ширина), мм, S_con=');% ручное задание полной ширины конструкции в мм
H_con=input('Размер конструкции по оси Z (высота), мм, H_con=');% ручное задание полной высоты конструкции в мм
 
n_el_L=input('Количество конечных элементов по длине конструкции, шт, n_el_L=');% ручное задание количества конечных элементов (далее - элементы) по длине конструкции
n_el_S=input('Количество конечных элементов по ширине конструкции, шт, n_el_S=');% ручное задание количества элементов по ширине конструкции
n_el_H=input('Количество конечных элементов по высоте конструкции, шт, n_el_H=');% ручное задание количества элементов по высоте конструкции
 
L_el=L_con/n_el_L;% расчёт длины КЭ
S_el=S_con/n_el_S;% расчёт ширины КЭ
H_el=H_con/n_el_H;% расчёт высоты КЭ
 
V_el=(S_el*H_el)*L_el;% расчёт объёма КЭ
A1_el=L_el*H_el;% расчёт плошади торцевой грани КЭ
A2_el=S_el*H_el;% расчёт плошади боковой грани КЭ
A3_el=L_el*S_el;% расчёт плошади верхней/ нижней грани КЭ
A4_el=(A1_el+A2_el+A3_el)*2;% расчёт плошади поверхности КЭ
 
disp ('Линейные размеры, объём и площадные характеристики конечных элементов определены.');% описание этапа работы функции (для удобства и наглядности)
 
%    ???   disp ('Рассчитанные геометрические параметры КЭ: длина - ', int2str(L_el), ' мм;', ' ширина - ', int2str(S_el), ' мм;', ' высота - ', int2str(H_el), ' мм.');
 
disp ('Раздел 1.1 выполнен!');% описание этапа работы функции (для удобства и наглядности)
 
disp ('Раздел 1.2: Формирование конечноэлементной сетки и матриц соответствия.');% описание этапа работы функции (для удобства и наглядности)
 
disp ('Методика нумерации КЭ и узлов: "слева-направо, от наблюдателя, от нижнего слоя к верхнему". Методика локальной нумерации узлов: "Против часовой стрелки от наименьшего глобального узла".');% информационное сообщение для пояснения алгоритма расчёта
 
n_el=n_el_L*n_el_S*n_el_H;% расчёт количества элементов в КЭ представлении конструкции (далее КЭ-схема)
el_array=zeros(1, n_el);% создание нулевого массива для формирования порядкового вектора - строки элементов КЭ-схемы
for n_el=1:1:n_el% инициация цикла перебора номеров элементов КЭ-схемы внутри порядкового вектра-строки элементов КЭ-схемы; создание вектора элементов
   el_array(1,n_el)=n_el;% присвоение элементам порядкового вектра-строки элементов КЭ-схемы порядковых значений этих элементов
end
 
n_jun=(n_el_L+1)*(n_el_S+1)*n_el_H;% расчёт количества узлов в КЭ-схеме
jun_array=zeros(1, n_jun);% создание нулевого массива для формирования порядкового вектора - строки узлов КЭ-схемы
for n_jun=1:1:n_jun% инициация цикла перебора номеров узлов КЭ-схемы внутри порядкового вектра-строки узлов КЭ-схемы; создание вектора узлов
   jun_array(1,n_jun)=n_jun;% присвоение элементам порядкового вектра-строки элементов КЭ-схемы порядковых значений этих элементов
end
 
disp ('Рассчитано общее количество конечных элементов и узлов в конструкции, сформированы порядковые векторы.');% описание этапа работы функции (для удобства и наглядности)
 
jun_coord_array=zeros(3, n_jun);% создание нулевого массива для формирования матрицы координат узлов КЭ-схемы
for level=1:1:n_el_H;% инициация цикла перебора "этажей" элементов КЭ-схемы; создание массива "узлы - координаты"
   for row_of_jun=1:1:n_el_S+1;% инициация цикла перебора рядов узлов КЭ-схемы
      for jun=1:1:n_el_L+1;% инициация цикла перебора узлов одного ряда
         jun_coord_array(1, ((level-1)*(n_el_L+1)*(n_el_S+1))+((row_of_jun-1)*(n_el_L+1))+jun)=(jun-1)*L_el;% расчёт и присвоение X-координат соответствующим узлам КЭ-схемы (заполнение матрицы jun_coord_array)
         jun_coord_array(2, ((level-1)*(n_el_L+1)*(n_el_S+1))+((row_of_jun-1)*(n_el_L+1))+jun)=(row_of_jun-1)*S_el;% расчёт и присвоение Y-координат соответствующим узлам КЭ-схемы (заполнение матрицы jun_coord_array)
         jun_coord_array(3, ((level-1)*(n_el_L+1)*(n_el_S+1))+((row_of_jun-1)*(n_el_L+1))+jun)=(H_el*0.5)+((level-1)*H_el);% расчёт и присвоение Z-координат соответствующим узлам КЭ-схемы (заполнение матрицы jun_coord_array)
      end
   end
end
 
el_loc_ind_array=zeros(4, n_el);% создание нулевого массива для формирования матрицы упорядоченного соответствия локальной нумерации узлов КЭ-схемы конечным элементам
for level=1:1:n_el_H;% инициация цикла перебора "этажей" элементов КЭ-схемы; создание упордоченного массива "глобальные узлы - локальные узлы"
   for row_of_el=1:1:n_el_S;% инициация цикла перебора рядов  элементов КЭ-схемы
      for el=1:1:n_el_L;% инициация цикла перебора элементов одного ряда
         el_loc_ind_array(1, ((level-1)*(n_el_L)*(n_el_S))+((row_of_el-1)*(n_el_L))+el)=((level-1)*(n_el_L+1)*(n_el_S+1))+((row_of_el-1)*(n_el_L+1))+el;% вычисление и присвоение глобального номера узла i-му узлу элемента (заполнение матрицы el_loc_ind_array)
         el_loc_ind_array(2, ((level-1)*(n_el_L)*(n_el_S))+((row_of_el-1)*(n_el_L))+el)=el_loc_ind_array(1, ((level-1)*(n_el_L)*(n_el_S))+((row_of_el-1)*(n_el_L))+el)+1;% вычисление и присвоение глобального номера узла j-му узлу элемента (заполнение матрицы el_loc_ind_array)
         el_loc_ind_array(3, ((level-1)*(n_el_L)*(n_el_S))+((row_of_el-1)*(n_el_L))+el)=el_loc_ind_array(2, ((level-1)*(n_el_L)*(n_el_S))+((row_of_el-1)*(n_el_L))+el)+(n_el_L+1);% вычисление и присвоение глобального номера узла k-му узлу элемента (заполнение матрицы el_loc_ind_array)
         el_loc_ind_array(4, ((level-1)*(n_el_L)*(n_el_S))+((row_of_el-1)*(n_el_L))+el)=el_loc_ind_array(3, ((level-1)*(n_el_L)*(n_el_S))+((row_of_el-1)*(n_el_L))+el)-1;% вычисление и присвоение глобального номера узла l-му узлу элемента (заполнение матрицы el_loc_ind_array)
      end
   end
end
 
disp ('Сформированы матрицы соответствия "узлы - координаты" и "глобальные узлы - локальные узлы".');% описание этапа работы функции (для удобства и наглядности)
disp ('Раздел 1.2 выполнен!');% описание этапа работы функции (для удобства и наглядности)
 
disp ('Раздел 1.3: Формирование физико-механических параметров конструкции.');% описание этапа работы функции (для удобства и наглядности)
 
Rb=input('Предельная прочность бетона при одноосном сжатии, МПа (=Н/мм^2), Rb=');% задание призменной прочнтости бетона при одноосном сжатии в возрасте 24 суток
Rbt=input('Предельная прочность бетона при одноосном растяжении, МПа (=Н/мм^2), Rbt=');% задание призменной прочнтости бетона при одноосном растяжении в возрасте 24 суток
E0_con=input('Начальный модуль упругости I-го рода для бетона, МПа (=Н/мм^2), E0_con=');% задание начального модуля упругости первого рода для бетона в возрасте 24 суток
nu0_con=input('Начальный коэффициент Пуассона для бетона, nu0_con=');% задание начального коэфициента Пуассона для бетона в возрасте 24 суток
lim_def_con_X=input('Предельная относительная деформация бетона при одноосном сжатии (со знаком "+"), lim_def_con_X=');% задание предельной относительной деформации бетона при одноосном сжатии в возрасте 24 суток
 
E0_arm=input('Начальный модуль упругости I-го рода для арматурной стали, МПа (=Н/мм^2), E0_arm=');% задание начального модуля упругости первого рода для арматурной стали
G0_arm=0.385*E0_arm;% расчёт начального модуля упругости второго рода для арматурной стали
K0_arm=(E0_arm*G0_arm)/(3*((3*G0_arm)-E0_arm));% расчёт начального модуля упругости третьего рода для арматурной стали
nu0_arm=input('Начальный коэффициент Пуассона для арматурной стали, nu0_arm=');% задание начального коэфициента Пуассона для для арматурной стали
 
G0_con=0.4*E0_con;% расчёт начального модуля упругости второго рода для бетона в возрасте 24 суток
K0_con=(E0_con*G0_con)/(3*((3*G0_con)-E0_con));% расчёт начального модуля упругости третьего рода для бетона в возрасте 24 суток
hi=Rbt/Rb;% расчёт соотношения прочностей бетона при одноосном растяжении и одноосном сжатии в возрасте 24 суток
R2c=1.184*Rb;% расчёт призменной прочности бетона при двухосном сжатии в возрасте 24 суток
 
lim_def_con_Y=nu0_con*lim_def_con_X;% расчёт предельной относительной деформации бетона по оси Y при одноосном сжатии в возрасте 24 суток
lim_def_con_Z=nu0_con*lim_def_con_X;% расчёт предельной относительной деформации бетона по оси Z при одноосном сжатии в возрасте 24 суток
lim_shift_con=1.414*lim_def_con_X;% расчёт предельного октаэдрического сдвига бетона при одноосном сжатии в возрасте 24 суток
 
disp ('Рассчитаны механические параметры составляющих конструкцию материалов (бетона и арматурной стали).');% описание этапа работы функции (для удобства и наглядности)
 
E0_array=zeros(3,n_el);% создание нулевого массива как заготовки для массива значений модуля упругости I-го рода элементов КЭ-схемы
E0_array(:,:)=E0_con;% присвоение всем значениям массива величины модуля упругости I-го рода бетона
 
G0_array=zeros(3,n_el);% создание нулевого массива как заготовки для массива значений модуля упругости II-го рода элементов КЭ-схемы
G0_array(:,:)=G0_con;% присвоение всем значениям массива величины модуля упругости II-го рода бетона
 
K0_array=zeros(1,n_el);% создание нулевого массива как заготовки для массива значений модуля упругости III-го рода элементов КЭ-схемы
K0_array(1,:)=K0_con;% присвоение всем значениям массива величины модуля упругости III-го рода бетона
 
nu0_array=zeros(3,n_el);% создание нулевого массива как заготовки для массива значений коэффициента Пуассона элементов КЭ-схемы
nu0_array(:,:)=nu0_con;% присвоение всем значениям массива величины коэффициента Пуассона бетона
 
n_reinf_levels=input('Количество армированных слоёв конструкции, шт, n_reinf_levels=');% указание количество слоёв КЭ-схемы, в которых есть арматура
 
if n_reinf_levels>0
 
for n_reinf_levels=1:1:n_reinf_levels;% инициация цикла последовательного перебора армированных слоёв КЭ-схемы; послойное приведение жёсткостных параметров КЭ-схемы и их запись в соответствующие массивы
   
   calculating_reinforced_level=n_reinf_levels %#ok<NOPRT,NASGU> вывод на экран порядкового номера армированного слоя, параметры которого предполагается рассчитать (для удобства задания исходных данных)
   num_of_level=input('Положение армированного слоя в конструкции (номер армированного "этажа" элементов в общей КЭ-схеме (нумерация снизу вверх)), num_of_level=');% указание номера рассчитываемого уровня в общей "этажной" КЭ-схеме
   d_reinf_bars=input('Диаметр арматурных стержней в рассматриваемом слое, мм, d_reinf_bars=');% задание диаметра арматурных стержней, которыми армирован обсчитываемый слой
   
   n_bars_X=input('Количество арматурных стержней, направленных вдоль оси X, шт, n_bars_X=');% задание количества арматурных стержней, ориентированных вдоль оси X
   n_bars_Y=input('Количество арматурных стержней, направленных вдоль оси Y, шт, n_bars_Y=');% задание количества арматурных стержней, ориентированных вдоль оси Y
   n_bars_Z=input('Количество арматурных стержней, направленных вдоль оси Z, шт, n_bars_Z=');% задание количества арматурных стержней, ориентированных вдоль оси Z
   
   if n_bars_X>0% проверка наличия в обсчитываемом слое арматурных стержней, ориентированных вдоль оси X
      Exx_lev=(((((pi*(d_reinf_bars^2))/4)*n_bars_X)*E0_arm)+(((A2_el*n_el_S)-(((pi*(d_reinf_bars^2))/4)*n_bars_X))*E0_con))/(A2_el*n_el_S);% приведение модуля упругости I-го рода в соответствии с соотношением площадей поперечных сечений бетона и арматуры
      Gxz_lev=(((((pi*(d_reinf_bars^2))/4)*n_bars_X)*G0_arm)+(((A2_el*n_el_S)-(((pi*(d_reinf_bars^2))/4)*n_bars_X))*G0_con))/(A2_el*n_el_S);% приведение модуля упругости II-го рода в соответствии с соотношением площадей поперечных сечений бетона и арматуры (соотношение рассматривается для перпендикулярного направления)
      nu_xy_lev=(((((pi*(d_reinf_bars^2))/4)*n_bars_X)*nu0_arm)+(((A2_el*n_el_S)-(((pi*(d_reinf_bars^2))/4)*n_bars_X))*nu0_con))/(A2_el*n_el_S);% приведение коэффициента Пуассона в соответствии с соотношением площадей поперечных сечений бетона и арматуры (соотношение рассматривается для перпендикулярного направления)
   end
   
   if n_bars_Y>0% проверка наличия в обсчитываемом слое арматурных стержней, ориентированных вдоль оси Y
      Eyy_lev=(((((pi*(d_reinf_bars^2))/4)*n_bars_Y)*E0_arm)+(((A1_el*n_el_L)-(((pi*(d_reinf_bars^2))/4)*n_bars_Y))*E0_con))/(A1_el*n_el_L);% приведение модуля упругости I-го рода в соответствии с соотношением площадей поперечных сечений бетона и арматуры
      Gxy_lev=(((((pi*(d_reinf_bars^2))/4)*n_bars_Y)*G0_arm)+(((A1_el*n_el_L)-(((pi*(d_reinf_bars^2))/4)*n_bars_Y))*G0_con))/(A1_el*n_el_L);% приведение модуля упругости II-го рода в соответствии с соотношением площадей поперечных сечений бетона и арматуры (соотношение рассматривается для перпендикулярного направления)
      nu_yx_lev=(((((pi*(d_reinf_bars^2))/4)*n_bars_Y)*nu0_arm)+(((A1_el*n_el_L)-(((pi*(d_reinf_bars^2))/4)*n_bars_Y))*nu0_con))/(A1_el*n_el_L);% приведение коэффициента Пуассона в соответствии с соотношением площадей поперечных сечений бетона и арматуры (соотношение рассматривается для перпендикулярного направления)
   end
   
     if n_bars_Z>0% проверка наличия в обсчитываемом слое арматурных стержней, ориентированных вдоль оси Z
      Ezz_lev=(((((pi*(d_reinf_bars^2))/4)*n_bars_Z)*E0_arm)+(((A3_el*n_el_L*n_el_S)-(((pi*(d_reinf_bars^2))/4)*n_bars_Z))*E0_con))/(A3_el*n_el_L*n_el_S);% приведение модуля упругости I-го рода в соответствии с соотношением площадей поперечных сечений бетона и арматуры
      Gyz_lev=(((((pi*(d_reinf_bars^2))/4)*n_bars_Z)*G0_arm)+(((A3_el*n_el_L*n_el_S)-(((pi*(d_reinf_bars^2))/4)*n_bars_Z))*G0_con))/(A3_el*n_el_L*n_el_S);% приведение модуля упругости II-го рода в соответствии с соотношением площадей поперечных сечений бетона и арматуры (соотношение рассматривается для перпендикулярного направления)
      nu_zx_lev=(((((pi*(d_reinf_bars^2))/4)*n_bars_Z)*nu0_arm)+(((A3_el*n_el_L*n_el_S)-(((pi*(d_reinf_bars^2))/4)*n_bars_Z))*nu0_con))/(A3_el*n_el_L*n_el_S);% приведение коэффициента Пуассона в соответствии с соотношением площадей поперечных сечений бетона и арматуры (соотношение рассматривается для перпендикулярного направления)
     end 
      
   K_lev=(((((((pi*d_reinf_bars^2)/4)*n_bars_X)*L_con)+((((pi*d_reinf_bars^2)/4)*n_bars_Y )*S_con)+((((pi*d_reinf_bars^2)/4)*n_bars_Z )*H_el))*K0_arm)+(((((L_con*S_con*H_el)-((((pi*d_reinf_bars^2)/4)*n_bars_X )*L_con)-((((pi*d_reinf_bars^2)/4)*n_bars_Y )*S_con)-((((pi*d_reinf_bars^2)/4)*n_bars_Z )*H_el))*K0_con))))/(L_con*S_con*H_el);% приведение модуля упругости III-го рода в соответствии с соотношением объёма бетона и арматуры в обсчитываемом слое (этаже)
   
   E0_array(1,((num_of_level-1)*(n_el_L*n_el_S))+1:((num_of_level)*(n_el_L*n_el_S)))=Exx_lev;% присвоение соответствующим элементам соответствующего массива соответствующих приведённых жёсткостных параметров (схема расположения в массивах параметров приведена в записи в рабочей тетради от 19.01.2018)
   E0_array(2,((num_of_level-1)*(n_el_L*n_el_S))+1:((num_of_level)*(n_el_L*n_el_S)))=Eyy_lev;% присвоение соответствующим элементам соответствующего массива соответствующих приведённых жёсткостных параметров (схема расположения в массивах параметров приведена в записи в рабочей тетради от 19.01.2018)
   E0_array(3,((num_of_level-1)*(n_el_L*n_el_S))+1:((num_of_level)*(n_el_L*n_el_S)))=Ezz_lev;% присвоение соответствующим элементам соответствующего массива соответствующих приведённых жёсткостных параметров (схема расположения в массивах параметров приведена в записи в рабочей тетради от 19.01.2018)
   
   G0_array(1,((num_of_level-1)*(n_el_L*n_el_S))+1:((num_of_level)*(n_el_L*n_el_S)))=Gxz_lev;% присвоение соответствующим элементам соответствующего массива соответствующих приведённых жёсткостных параметров (схема расположения в массивах параметров приведена в записи в рабочей тетради от 19.01.2018)
   G0_array(2,((num_of_level-1)*(n_el_L*n_el_S))+1:((num_of_level)*(n_el_L*n_el_S)))=Gxy_lev;% присвоение соответствующим элементам соответствующего массива соответствующих приведённых жёсткостных параметров (схема расположения в массивах параметров приведена в записи в рабочей тетради от 19.01.2018)
   G0_array(3,((num_of_level-1)*(n_el_L*n_el_S))+1:((num_of_level)*(n_el_L*n_el_S)))=Gyz_lev;% присвоение соответствующим элементам соответствующего массива соответствующих приведённых жёсткостных параметров (схема расположения в массивах параметров приведена в записи в рабочей тетради от 19.01.2018)
      
   K0_array(1,((num_of_level-1)*(n_el_L*n_el_S))+1:((num_of_level)*(n_el_L*n_el_S)))=K_lev;% присвоение соответствующим элементам соответствующего массива соответствующих приведённых жёсткостных параметров (схема расположения в массивах параметров приведена в записи в рабочей тетради от 19.01.2018)
   
   nu0_array(1,((num_of_level-1)*(n_el_L*n_el_S))+1:((num_of_level)*(n_el_L*n_el_S)))=nu_xy_lev;% присвоение соответствующим элементам соответствующего массива соответствующих приведённых жёсткостных параметров (схема расположения в массивах параметров приведена в записи в рабочей тетради от 19.01.2018)
   nu0_array(2,((num_of_level-1)*(n_el_L*n_el_S))+1:((num_of_level)*(n_el_L*n_el_S)))=nu_yx_lev;% присвоение соответствующим элементам соответствующего массива соответствующих приведённых жёсткостных параметров (схема расположения в массивах параметров приведена в записи в рабочей тетради от 19.01.2018)
   nu0_array(3,((num_of_level-1)*(n_el_L*n_el_S))+1:((num_of_level)*(n_el_L*n_el_S)))=nu_zx_lev;% присвоение соответствующим элементам соответствующего массива соответствующих приведённых жёсткостных параметров (схема расположения в массивах параметров приведена в записи в рабочей тетради от 19.01.2018)
         
end
 
disp ('Осуществлено приведение приведение жёсткостных параметров конструкции в соответствии со схемой армирования.');% описание этапа работы функции (для удобства и наглядности)
 
end
 
disp ('Раздел 1.3 выполнен!');% описание этапа работы функции (для удобства и наглядности)
 
 
disp('Блок 2: Формирование массива матриц градиентов, жёсткости и упругости для конечных элементов и КЭ-схемы конструкции в целом.')% описание этапа работы функции (для удобства и наглядности)
 
Mx_el_prop=cell(5, n_el);% создание массива для внесения упругих харктеристик элементов КЭ-схемы
 
disp ('Раздел 2.1: Формирование матриц градиентов для конечных элементов');% описание этапа работы функции (для удобства и наглядности)
 
for n_el=1:1:n_el% инициация цикла перебора элементов КЭ-схемы
   
   Ni=((L_el - jun_coord_array(1,(el_loc_ind_array(1, n_el))))*(S_el - jun_coord_array(2,(el_loc_ind_array(1, n_el)))))/(L_el*S_el);
   Nj=((L_el - jun_coord_array(2,(el_loc_ind_array(2, n_el))))*(jun_coord_array(1,(el_loc_ind_array(2, n_el)))))/(L_el*S_el);
   Nk=(jun_coord_array(1,(el_loc_ind_array(3, n_el)))*jun_coord_array(2,(el_loc_ind_array(3, n_el))))/(L_el*S_el);
   Nl=((L_el - jun_coord_array(1,(el_loc_ind_array(4, n_el))))*(jun_coord_array(2,(el_loc_ind_array(4, n_el)))))/(L_el*S_el);
   
   dNi_dx=(jun_coord_array(2,(el_loc_ind_array(1, n_el)))-S_el)/(L_el*S_el);
   dNj_dx=(L_el - jun_coord_array(2,(el_loc_ind_array(2, n_el))))/(L_el*S_el);
   dNk_dx=jun_coord_array(2,(el_loc_ind_array(3, n_el)))/(L_el*S_el);
   dNl_dx=-jun_coord_array(2,(el_loc_ind_array(4, n_el)))/(L_el*S_el);
   
   dNi_dy=(jun_coord_array(1,(el_loc_ind_array(1, n_el))) - L_el)/(L_el*S_el);
   dNj_dy=-jun_coord_array(1,(el_loc_ind_array(2, n_el)))/(L_el*S_el);
   dNk_dy=jun_coord_array(1,(el_loc_ind_array(3, n_el)))/(L_el*S_el);
   dNl_dy=(L_el - jun_coord_array(1,(el_loc_ind_array(4, n_el))))/(L_el*S_el);
   
   B_block_i=[dNi_dx 0 dNi_dy 0 0 0 0 0; 0 dNi_dy dNi_dx 0 0 0 0 0; 0 0 0 0 0 0 dNi_dx dNi_dy; 0 0 0 dNi_dx 0 dNi_dy Ni 0; 0 0 0 0 dNi_dy dNi_dx 0 Ni];
   B_block_j=[dNj_dx 0 dNj_dy 0 0 0 0 0; 0 dNj_dy dNj_dx 0 0 0 0 0; 0 0 0 0 0 0 dNj_dx dNj_dy; 0 0 0 dNj_dx 0 dNj_dy Nj 0; 0 0 0 0 dNj_dy dNj_dx 0 Nj];
   B_block_k=[dNk_dx 0 dNk_dy 0 0 0 0 0; 0 dNk_dy dNk_dx 0 0 0 0 0; 0 0 0 0 0 0 dNk_dx dNk_dy; 0 0 0 dNk_dx 0 dNk_dy Nk 0; 0 0 0 0 dNk_dy dNk_dx 0 Nk];
   B_block_l=[dNl_dx 0 dNl_dy 0 0 0 0 0; 0 dNl_dy dNl_dx 0 0 0 0 0; 0 0 0 0 0 0 dNl_dx dNl_dy; 0 0 0 dNl_dx 0 dNl_dy Nl 0; 0 0 0 0 dNl_dy dNl_dx 0 Nl];
   
   Mx_el_prop{1, n_el}=[B_block_i' B_block_j' B_block_k' B_block_l'];
   
end
 
end

До 172 строки проблем не было, всё считалось и возвращалось. Проблемы начались, когда повводил много вспомогательных переменных для расчёта компонентов матрицы градиентов (строки 183-196).

P.S. Разобрался с цитированием

Добавлено через 8 минут
Ещё немного подумал: в принципе можно прописать сохранение интересующих меня параметров в файлы формата .xls по ходу выполнения кода и таким образом запускать его из редактора, не заботясь о возвращении результатов функции в Matlab, но всё же представляет научно-спортивный интерес сделать весь алгоритм цельным, не "ущербным" модулем.
0
6830 / 4890 / 2065
Регистрация: 02.02.2014
Сообщений: 13,048
19.02.2018, 17:22 5
Лучший ответ Сообщение было отмечено Vitalii_Iurch как решение

Решение

в вашем случае не вижу необходимости выписывать выходные параметры функции, т.к. в работе только одна функция
закомментируйте первую и последнюю строки кода, и считайте на здоровье, вся рабочая информация будет храниться в workspace

переизбыток комментариев, но это на вкус и фломастеры разные...
рекомендация по комментариям, если они необходимы, то
Matlab M
1
2
3
4
% cooment
code
% комментарий
строка кода
лучше удлинять текст в высоту, чем в ширину...
1
Эксперт по математике/физике
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
20.02.2018, 08:29 6
Лучший ответ Сообщение было отмечено Vitalii_Iurch как решение

Решение

Цитата Сообщение от Vitalii_Iurch Посмотреть сообщение
До 172 строки проблем не было, всё считалось и возвращалось.
Вот так писать очень не аккуратно
Matlab M
1
for n_el=1:1:n_el% инициация цикла перебора элементов КЭ-схемы
И зачем Вам столько выходных параметров?
Например dN*_dx - это один из элементов массива данных

Если пользователь введет n_reinf_levels=0, то ряд выходных параметров (n_bars_*, d_reinf_bars) будет неопределённ, что приведет к ошибке.
Также если n_reinf_levels>1, то количество стержней в предыдущих слоях Вас похоже не интересует, Вы сохраняете для дальнейшего использования только данные по последнему армированному слою, причем даже не сохраняя номер этого слоя.

Кроме этого, такой стиль приема параметров от пользователя перестали применять уже лет 20-25 назад (как только закончилась эпоха MS-DOS), да и в программах на MS-DOS и в других неграфических системах стремились уйти от получения данных от пользователя по запросу если данных более 5-7. Это вполне объяснимо, при вводе параметров пользователь довольно часто допускает ошибки, и ввести без ошибок 20-30 данных подряд довольно сложно. Хуже всего то, что если ошибка не грубая (когда программа не может определить что данные введены ошибочно), то пользователь вполне реально может не заметить ошибку ввода данных и в результате получит неверный результат расчета не зная об этом.
Вам желательно перейти на ввод данных из файла, например из EXCEL, тогда вероятность ошибки в данных значительно уменьшится.
Кроме этого, при тестировании расчетных блоков Вам потребуется самому осуществить запуск своей программы от 20 до нескольких сотен раз ( в зависимости от сложности расчетов), так что Вы на себе проверите насколько удобен реализуемый Вами способ ввода параметров.
1
0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 19
20.02.2018, 16:54  [ТС] 7
Цитата Сообщение от Krasme Посмотреть сообщение
в вашем случае не вижу необходимости выписывать выходные параметры функции, т.к. в работе только одна функция
закомментируйте первую и последнюю строки кода, и считайте на здоровье, вся рабочая информация будет храниться в workspace
Да, действительно, так проблема решается, спасибо !

Цитата Сообщение от Krasme Посмотреть сообщение
лучше удлинять текст в высоту, чем в ширину...
Для чтения без необходимости перемещения экрана вправо-влево - да, но мне пока так удобнее, т.к. лечге вычленять смысловые части кода в плане шагов расчёта.

Цитата Сообщение от SSC Посмотреть сообщение
Вот так писать очень не аккуратно

Matlab M
1
for n_el=1:1:n_el% инициация цикла перебора элементов КЭ-схемы
А чем это чревато? Я же прямым образом указал, начальный номер цикла, шаг и конечный номер ?

Цитата Сообщение от SSC Посмотреть сообщение
И зачем Вам столько выходных параметров?
Например dN*_dx - это один из элементов массива данных
Т.к. я, видимо, не до конца понимаю все механизмы возвращения результатов в ПО: в случае, если я убираю в заголовке функции из перечня возвращаемых результатов хоть какие-нибудь величины, напротив которых есть знак "=" в коде, то получаю при запуске скрипта ошибку ввиду того, что какие-то из рассчитываемых параметров не определены (в случае вызова функции из командной строки с полным указанием набора необходимых мне выходных параметров).

Цитата Сообщение от SSC Посмотреть сообщение
Если пользователь введет n_reinf_levels=0, то ряд выходных параметров (n_bars_*, d_reinf_bars) будет неопределённ, что приведет к ошибке.
Очевидно, это и случалось при запусках, о которых я писал в первом посте темы! Спасибо. Используя промежуточное решение:
Цитата Сообщение от Krasme Посмотреть сообщение
закомментируйте первую и последнюю строки кода, и считайте на здоровье
добился обхода этой проблемы, но в будущем, конечно, нужно будет подумать над этим местом.

Цитата Сообщение от SSC Посмотреть сообщение
Также если n_reinf_levels>1, то количество стержней в предыдущих слоях Вас похоже не интересует, Вы сохраняете для дальнейшего использования только данные по последнему армированному слою, причем даже не сохраняя номер этого слоя.
Верно, мне не важно сколько было стержней и в каком слое, для меня главное, что с учётом этого количества при каждом "пробеге" цикла для обсчитываемого слоя приводились (усреднялись) параметры упругости с учётом количества стержней. А они записываются как соответствующие элементы соответствующих массивов (3 массива для 3-х видов модулей упругости). Возможно это не совсем "строгий" алгоритм, но пока не хочу заниматься оптимизацией этого места - проверить бы общую релевантность расчётов.

Цитата Сообщение от SSC Посмотреть сообщение
Вам желательно перейти на ввод данных из файла, например из EXCEL
Здесь полностью согласен, но пока просто из-за объёма умений не могу этого сделать. Параллельно с написанием кода изучаю книгу по Matlab, надеюсь, в скором времени разберусь, как импортировать данные из ячеек для расчётов.

Добавлено через 18 минут
Цитата Сообщение от SSC Посмотреть сообщение
ряд выходных параметров (n_bars_*, d_reinf_bars) будет неопределённ, что приведет к ошибке
Увидел дальнейшее развитие этой ошибки; его не устраняет даже комментирование первой и последней строк (если мы заходим в данный цикл, но в каком-либо из направлений арматуры нет, то позже, я пытаюсь присвоить элементам соответствующего массива значения переменной, которая даже не рассчитывалась). Буду дальше мозговать над алгоритмом.

В общем, как оказалось, проблема не в количестве входных и выходных параметров...
0
6830 / 4890 / 2065
Регистрация: 02.02.2014
Сообщений: 13,048
20.02.2018, 17:22 8
Vitalii_Iurch, начните упрощение своего кода с ввода данных...
для начала сделайте некий контрольный вариант (можно парочку) с необходимыми параметрами, чтобы не вводить каждый раз вручную данные, на них отработайте свой алгоритм..
а потом можно отлаженный алгоритм применить (проверить) на большом множестве вариантов.
1
Эксперт по математике/физике
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
21.02.2018, 08:56 9
Цитата Сообщение от Vitalii_Iurch Посмотреть сообщение
А чем это чревато?
Вы на время выполнения цикла потеряли исходное значение этой величины и не можете ее использовать в теле цикла. Но и это не все, Вы также не можете прервать выполнение цикла, если это будет необходимо по какой-то причине. В некоторых языках такие действия вообще приведут к ошибке, поэтому желательно соблюдать "культуру" программирования.
Также примите как "культуру" программирования в MATLAB инициализацию в начале функции всех выходных переменных, это исключит ошибки, когда при некотором наборе значений переменных может возникнуть не определение выходных переменных как у Вас.
В MATLABe есть такой инструмент как структура данных (возможно я не по "матлабовски" называю это, но это очень похоже на структуры в С и С++). Заводите переменную, например D_NAME и в ней определяете поля
Matlab M
1
2
3
D_NAME.x=1;
D_NAME.y=2;
D_NAME.z=[1 2 3];
А потом в функции возвращаете D_NAME, и в вызывающей функцию процедуре сможете использовать все переменные из структуры (только не забывайте инициализацию).
Цитата Сообщение от Vitalii_Iurch Посмотреть сообщение
пока просто из-за объёма умений не могу этого сделать.
есть функция xlsread, там все очень просто.
1
0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 19
21.02.2018, 16:08  [ТС] 10
Цитата Сообщение от Krasme Посмотреть сообщение
Vitalii_Iurch, начните упрощение своего кода с ввода данных...
Цитата Сообщение от SSC Посмотреть сообщение
есть функция xlsread, там все очень просто.
Уже занялся, спасибо

Цитата Сообщение от SSC Посмотреть сообщение
Вы на время выполнения цикла потеряли исходное значение этой величины и не можете ее использовать в теле цикла.
Цитата Сообщение от SSC Посмотреть сообщение
В некоторых языках такие действия вообще приведут к ошибке, поэтому желательно соблюдать "культуру" программирования.
Хорошо, принял к сведению.

Цитата Сообщение от SSC Посмотреть сообщение
Вы также не можете прервать выполнение цикла, если это будет необходимо по какой-то причине
Вот здесь не понял, как эти 2 вещи связаны: используемая переменная и прерывание цикла.

Цитата Сообщение от SSC Посмотреть сообщение
Также примите как "культуру" программирования в MATLAB инициализацию в начале функции всех выходных переменных, это исключит ошибки, когда при некотором наборе значений переменных может возникнуть не определение выходных переменных как у Вас.
В MATLABe есть такой инструмент как структура данных (возможно я не по "матлабовски" называю это, но это очень похоже на структуры в С и С++). Заводите переменную, например D_NAME и в ней определяете поля
Matlab M
1
2
3
4
5
6
1
2
3
D_NAME.x=1;
D_NAME.y=2;
D_NAME.z=[1 2 3];
А потом в функции возвращаете D_NAME, и в вызывающей функцию процедуре сможете использовать все переменные из структуры (только не забывайте инициализацию).
Вот здесь, честно скажу, не понял. Не являюсь программистом, поэтому не до конца понял, что такое определение структуры и зачем это нужно. Т.е. мы каждой возвращаемой функции переменной присваиваем её возможные значения и, таки образом, можем даже не указывать её при вызове функции, в случае, если в данный момент нам эта переменная не нужна ?
0
Эксперт по математике/физике
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
22.02.2018, 08:36 11
Цитата Сообщение от Vitalii_Iurch Посмотреть сообщение
используемая переменная и прерывание цикла.
При выполнении цикла может возникнуть необходимость прервать дальнейшее выполнение цикла командой break, тогда переменная цикла не примет конечного значения и останется такой, какой была при прерывании цикла.
Цитата Сообщение от Vitalii_Iurch Посмотреть сообщение
что такое определение структуры и зачем это нужно.
Структура, это по сути некоторый блок данных, возможно разных типов. При этом при передаче данных в функцию и возврате данных из функции указывается не весь перечень данных, а только обозначение структуры - D_NAME (это не совсем точно по матлабовским канонам, но верно по сути). Таким образом избегается большой перечень параметров в функцию и из функции. А большие списки параметров могут приводить к ошибкам, когда Вы случайно перепутаете порядок следования переменных в списке.
Цитата Сообщение от Vitalii_Iurch Посмотреть сообщение
Т.е. мы каждой возвращаемой функции переменной присваиваем её возможные значения и, таки образом, можем даже не указывать её при вызове функции, в случае, если в данный момент нам эта переменная не нужна ?
Здесь я Вас не понял. Возможно Вы пишите про начальную инициализацию возвращаемых переменных некоторыми значениями по умолчанию, она необходима что бы исключить вероятность возникновения ошибок при выполнении программы с различными наборами данных.
1
0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 19
22.02.2018, 13:33  [ТС] 12
Цитата Сообщение от SSC Посмотреть сообщение
При выполнении цикла может возникнуть необходимость прервать дальнейшее выполнение цикла командой break, тогда переменная цикла не примет конечного значения и останется такой, какой была при прерывании цикла.
Ээх, придётся по всему скрипту переименовывать..

Цитата Сообщение от SSC Посмотреть сообщение
При этом при передаче данных в функцию и возврате данных из функции указывается не весь перечень данных, а только обозначение структуры - D_NAME
А, т.е. мы как бы в теле кода записываем все выходные параметры в данную структуру, присваиваем ей имя и далее при вызове функции указываем не весь перечень выходных переменных, а просто это имя структуры? Хотя тогда не понятно, как это работает с входными параметрами: в моём случае они не нужны, но обычно это же значения независимых переменных в форме цифр, которые каждый раз меняются, как их тогда записать в эти структуры?
0
6830 / 4890 / 2065
Регистрация: 02.02.2014
Сообщений: 13,048
22.02.2018, 14:07 13
Цитата Сообщение от Vitalii_Iurch Посмотреть сообщение
каждый раз меняются, как их тогда записать в эти структуры
пример
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function manf
clc; clear all;
D_NAME.x=1;
D_NAME.y=2;
D_NAME.z=[1 2 3];
D_NAME
D_NAME2=call_f(D_NAME);
D_NAME2
 
end
 
function name_struct=call_f(name_struct)
name_struct.y=10000;
end
1
0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 19
22.02.2018, 15:51  [ТС] 14
Цитата Сообщение от Krasme Посмотреть сообщение
пример
Спасибо!

В целом проблема, послужившая причиной создания темы решена, но всё-таки остаётся вопрос: ну вот не нужны мне в Workspace многие переменные (особенно их финальные значения, получаемые по окончанию циклов), это промежуточные данные (например строки строки 183-201 кода в сообщении № 4), как их тогда не выводить, если их нельзя убрать из списка выходных параметров (т.е. из строки 4 кода), чтобы не получить ошибку? Нужно все "запаковывать" во вложенные функции, что бы на самом верхнем уровне остались только необходимые мне величины в качестве возвращаемых результатов?
0
6830 / 4890 / 2065
Регистрация: 02.02.2014
Сообщений: 13,048
22.02.2018, 15:54 15
Цитата Сообщение от Vitalii_Iurch Посмотреть сообщение
не нужны мне в Workspace многие переменные
в конце программы сделать чистку
https://www.mathworks.com/help... clear.html
0
0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 19
22.02.2018, 23:12  [ТС] 16
Цитата Сообщение от Krasme Посмотреть сообщение
в конце программы сделать чистку
Окей

Всем спасибо за ответы!
0
22.02.2018, 23:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.02.2018, 23:12
Помогаю со студенческими работами здесь

Переменное количество аргументов в функции ( зацикливание )
Здравствуйте. Подскажите пожалуйста как правильно огранизировать доступ к каждому параметру....

Как задать переменное количество аргументов для чужой функции?
Помогите пожалуйста, имеется куча шаблонного кода когда выполняешь ExecSQLEx, например: if not...

Выполнить расчет функции от двух аргументов при заданных законах изменения аргументов
Выполнить расчет функции от двух аргументов при заданных законах изменения аргументов. Все значения...

Как в данной ситуации использовать функции, получающие и возвращающие различное количество аргументов?
Дана действительная матрица размера MхN. Упорядочить строки матрицы по невозрастанию значений...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru