Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 05.11.2012
Сообщений: 16

Реализовать сложную функцию, с интегрированием и получением множества графиков.

05.11.2012, 15:22. Показов 3244. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, только начинаю осваивать matlab. И встал вопрос, можно ли как-то использовать переменные без их инициализации?

Как пример
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function main
lambda_0=3;
i=3;
k_0=2*pi/lambda_0;
L_i=lambda_0*i;
ksi_opt=1+(lambda_0/2*L_i);
G_i_opt=k_0*ksi_opt;
delta_i=G_i_opt-k_0;
delta_i_n=delta_i/10;
 
m=0.5;
n=0.5;
a_i_n=n*delta_i_n;
G_na_i(z)=(G_i_opt-a_i_n)+a_i_n*sin(m*pi*z/L_i);
G_na_i(z)
end
Выдает вот такую ошибку
Undefined function or variable 'z'.

Error in main (line 14)
G_na_i(z)=(G_i_opt-a_i_n)+a_i_n*sin(m*pi*z/L_i);
В принципе, все понятно, что надо бы определить переменную z. Но мне требуется, для последующих вычислений, эта переменная в нетронутом, т.е. неизвестном виде. Хотелось бы спросить, возможно ли как-нибудь сделать так, что бы не использовалась ее инициализация?

Спасибо за ответ.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.11.2012, 15:22
Ответы с готовыми решениями:

Реализовать сложную передаточную функцию в Simulink
Всех с наступающим! Помогите реализовать данную передаточную функцию Wд(S) = (Tд2 S + 1)(Tд3 S + 1) / (Tд1 S + 1)(Tд4 S + 1) в...

Как реализовать такую сложную анимацию?
Интересует анимация на этом сайте. pride-reklama.ru изучил немного html css. хотел бы научиться так делать. не разрабатывать а хотябы...

Большие числа java, реализовать не сложную формулу
Нужно написать программу ApproximateE.java для нахождения приближенного значения числа "e", используя следующую формулу: ...

21
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
05.11.2012, 15:44
А можно поподробней о задании?
Впринципе можно сделать файл-функцию myfun.m:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function G_na_i = myfun(z)
lambda_0 = 3;
i = 3;
k_0 = 2*pi/lambda_0;
L_i = lambda_0*i;
ksi_opt = 1+(lambda_0/2*L_i);
G_i_opt = k_0*ksi_opt;
delta_i = G_i_opt - k_0;
delta_i_n = delta_i/10;
 
m = 0.5;
n = 0.5;
a_i_n = n*delta_i_n;
G_na_i = (G_i_opt - a_i_n) + a_i_n*sin(m*pi*z/L_i);
end
1
0 / 0 / 0
Регистрация: 05.11.2012
Сообщений: 16
05.11.2012, 16:00  [ТС]
Задание в целом, достаточно объемное и связанно с расчетами антенн. Но если вкратце, то для начала, нужно найти функцию выше, потом меняя параметры m и n, подставлять ее в интеграл и рассчитывать его, а после нормировать и строить графики.

Сделал, по вашему совету, но возникла новая проблема.
myfun
Error using myfun (line 14)
Not enough input arguments.
Просто для дальнейших расчетов, требуется что бы z, так и осталась в выражении, потом интеграл будет браться по ней.
0
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
05.11.2012, 16:25
Дык надо было z указать!

Еще раз:
1. Создаем файл-функцию myfun.m:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function G_na_i = myfun(z)
lambda_0 = 3;
i = 3;
k_0 = 2*pi/lambda_0;
L_i = lambda_0*i;
ksi_opt = 1+(lambda_0/2*L_i);
G_i_opt = k_0*ksi_opt;
delta_i = G_i_opt - k_0;
delta_i_n = delta_i/10;
 
m = 0.5;
n = 0.5;
a_i_n = n*delta_i_n;
G_na_i = (G_i_opt - a_i_n) + a_i_n*sin(m*pi*z/L_i);
(ЭТО ОТДЕЛЬНЫЙ ФАЙЛ! его запускать не надо!)

2. В том же каталоге пишем программу prog.m которая использует ф-цию myfun:
Matlab M
1
2
3
4
5
6
clear
clc
 
z = linspace(0,100,500); % диапазон значений z от 0 до 100, 500 точек
I = trapz(myfun(z)) % интеграл
plot(z,myfun(z)) % строим график
Ну, понял, не?

Добавлено через 4 минуты
А если тебе надо менять еще m и n, то можно сделать функцию еще и от них:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
function G_na_i = myfun(m,n,z)
lambda_0 = 3;
i = 3;
k_0 = 2*pi/lambda_0;
L_i = lambda_0*i;
ksi_opt = 1+(lambda_0/2*L_i);
G_i_opt = k_0*ksi_opt;
delta_i = G_i_opt - k_0;
delta_i_n = delta_i/10;
a_i_n = n*delta_i_n;
 
G_na_i = (G_i_opt - a_i_n) + a_i_n*sin(m*pi*z/L_i);
Тога использовать нужно так:
Matlab M
1
2
3
4
5
m = 0.5;
n = 0.5;
z = linspace(0,100,500); % диапазон значений z от 0 до 100, 500 точек
I = trapz( myfun(m,n,z) ) % интеграл
plot(z, myfun(m,n,z) ) % строим график
2
0 / 0 / 0
Регистрация: 05.11.2012
Сообщений: 16
05.11.2012, 16:58  [ТС]
Спасибо, щас попробую дописать программу до конца, вы очень помогли

Попробовал дописать программу, но опять переменная z неизвестна... Нужно создать отдельную функцию для выражения F(tetta), правильно ли я понял?

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
function main
clear
clc
global k_0 L_i;
F(tetta) = exp(1i*k_0*z*cos(tetta)-1i*myfun(z)*z);
z = linspace(0,L_i,500);
F_I1(tetta) = trapz(F(tetta)); % интеграл
f(tetta)=F_I1(tetta)/F(0); % нормирование функции
plot(tetta,f(tetta)) % строим график
end
 
function G_na_i = myfun(z)
lambda_0 = 3;
i = 3;
k_0 = 2*pi/lambda_0;
L_i = lambda_0*i;
ksi_opt = 1+(lambda_0/2*L_i);
G_i_opt = k_0*ksi_opt;
delta_i = G_i_opt - k_0;
delta_i_n = delta_i/10;
m = 0.5;
n = 0.5;
a_i_n = n*delta_i_n;
G_na_i = (G_i_opt - a_i_n) + a_i_n*sin(m*pi*z/L_i);
end
0
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
05.11.2012, 17:15
Эм... у тебя функция со встроенными функциями? я совсем запутался!
Что у тебя входные параметры, а что нужно рассчитать?
У тебя выходит функция двух переменных F(teta,z) ?
И еще F(tetta) - это не функция!!! а обращение к элементу № tetta массива F. Поэтому он будет ругаться на все F(tetta).

И зачем ты пишешь function main? Это что функция которая ничего не принимает, ничего не возвращает? или ты еще с Си не переехал?

Добавлено через 4 минуты
Тут самое главное - чтобы ты сам понял, что тебе нужно получить!
0
0 / 0 / 0
Регистрация: 05.11.2012
Сообщений: 16
05.11.2012, 17:38  [ТС]
В общем постараюсь написать в формулах.

В общем подготавливаем параметры:
1. Задаем λ0=3 см;
2. Задаем длину антенны i=3; Li0*i;
3. Рассчитываем все вспомогательные параметры. ζопт=1+λ0/2*Li;
4. Гiопт=k0опт;
5. Δiiопт-k0;
6. Δini/10;
7. ain=n*Δin;
Функцию в общем случае будет выглядеть так:
Gnai(z)=(Гiопт±ain)±ain*sin(m*n*z/Li);
Рассмотрим к примеру 1-й случай. Вычислим данную функцию. На данном этапе, нужно, что бы z была не определенна, ну и m, n тоже можно оставить не определенными.
1. G(z)=(Гiопт-ain)+ain*sin(m*n*z/Li);
Далее находим Амплитуду бегущей волны. i - комплексная переменная
1. https://www.cyberforum.ru/cgi-bin/latex.cgi?F(\theta)= \int_{z=0}^{Li}{e}^{i*{k}_{0}*z*cos(\theta)-i*G(z)*z}dz
После этого нормируем функцию.
1.f(θ)=F(θ)/F(0);
Теперь задаем m=0.5, и меняя n от 0 до 10 строим 10 графиков f(θ) на одном рисунке если можно.
Вот примерно, самое начало задания выглядит так. Вот главное разобраться с этими параметрами, как их можно использовать не индифицированными. Спасибо еще раз большое, за желание помочь.

Ну да, по-поводу с, вы безусловно правы, привык к нему, но столь много математических операций, все же лучше, выполнить в матлабе. Просто привык к заглавным функциям, и хотелось для наглядности расположить все в одном m файле.
0
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
05.11.2012, 17:47
Воо, уже понемногу проясняется подумаю на досуге.
Единственное, что еще не понятно - что такое k0 в п. 4, чему оно равно?
0
0 / 0 / 0
Регистрация: 05.11.2012
Сообщений: 16
05.11.2012, 20:45  [ТС]
По идее на выходе, должны получится такой график, ну только с 10 разными n;
http://s1.ipicture.ru/uploads/... qfTreh.jpg
А ну k0 волновое число, 2*pi/λ0

Еще раз спасибо за помощь = )

Добавлено через 2 часа 58 минут
Посидев и подумав, написал данный код, и вроде без ошибок, но проблема в том, что график не строится, т.е. интеграл равен 0. Хотя на шаге вычисления функция, все значения вроде как нормальные.

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
function main
clear
clc
global L_i lambda_0
par_i = 3;
lambda_0 = 3;
L_i = lambda_0*par_i;
syms z tetta m n;
myfun(m,n,z);
m=0.5;
n=0.5;
F = myfun2(z,tetta,m,n);
z = linspace(0,L_i,500);
tetta = linspace(0,L_i,500);
F_I1 = trapz(F);
plot(tetta, F_I1);
end
 
function G_na_i = myfun(m,n,z)
global L_i lambda_0 k_0
k_0 = 2*pi/lambda_0;
ksi_opt = 1+(lambda_0/2*L_i);
G_i_opt = k_0*ksi_opt;
delta_i = G_i_opt - k_0;
delta_i_n = delta_i/10;
a_i_n = n*delta_i_n;
G_na_i = (G_i_opt - a_i_n) + a_i_n*sin(m*pi*z/L_i);
end
 
function F = myfun2(z,tetta,m,n)
global k_0
F = exp(1i*k_0*z*cos(tetta)-1i*myfun(m,n,z)*z);
end
Плюс в том, что я понял, не инициализированные переменные можно использовать через команду syms, а потом переопределять их.

В чем может быть ошибка в вычислении интеграла? Ведь на подготовительных этапах, функция выдает значения. К примеру
fun = (29*pi)/3 - (9*pi*n)/10 + (9*pi*n*sin((pi*m*z)/9))/10
F = 1/exp(z*((pi*553*i)/60 + (pi*sin((pi*z)/18)*9*i)/20) + pi*z*cos(tetta)*(-(2*i)/3))
0
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
05.11.2012, 21:41
syms лучше не использовать, т.к. в этом случае результат получается не число, а в символьном формате! Поэтому и результат может быть нулевым.
И не стоит писать директиву function main в скрипт-файле, т.к. она служит для обозначени файл-функций и встроенных функций, которые живут своей отдельной жизнью в "параллельной вселенной" памяти. Это все-равно, что дать тебе лом и сказать заметать)))
И глобальные переменные тут не нужны.
Matlab такая своеобразная штука, что вначале нужно определить массив входных значений и на их основе посчитать массивы результатов (заметь, нигде ни слова о функциях!).
И еще такой момент: интеграл функции на промежутке это число, одно единственное!
Поэтому и результат:
Matlab M
1
2
3
x = 0:0.01:10; % диапазон
f = x.*exp(-x); % функция
F = trapz(f); % интеграл функции в диапазоне от 0 до 10.
здесь x и f - массивы, а интеграл F - число.

Потерпи до завтра и я все распишу и нарисую! :)
2
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
06.11.2012, 11:33
Фуф! Победил!
Чтобы все было в одном файле пришлось таки оставить function main.
Кликните здесь для просмотра всего текста
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
function main
clear all
clc
 
% 1. Задаем длинну волны
lamda = 3;  
% 2. Задаем длину антенны
iL = 3;
L = iL*lamda;
 
tetta = linspace(0,pi,100); % диапазон значений tetta
n = 0:10; % диапазон значений n
 
% Начинаем игры с n
for j = 1:length(n)
    y = abs( F(tetta,n(j),lamda,L) ); % считаем модуль F(tetta)
    f(:,j) = y / max(y); % нормируем
    t(:,j) = tetta;
    leg1(:,j) = {['n=',num2str(n(j))]};
end
 
% строим графики
plot(t,f)
legend(leg1)
grid on
ylim([0 1.01])
xlim([0 pi])
xlabel('\theta')
ylabel('F(\theta)')
set(gca,'XTick',0:pi/4:pi)
set(gca,'XTickLabel',{'0','pi/4','pi/2','3*pi/4','pi'})
 
% тут и фнкции конец!
% а кто понял - молодец! :)
end
 
 
 
function f = F(tetta, n, lamda, L)
% Рассчитываем вспомогательные параметры
z_opt = 1 + lamda/(2*L);
k0 = 2*pi/lamda;
G_opt = k0*z_opt;
delta = G_opt - k0;
delta_n = delta/10;
 
i = sqrt(-1); % мнимая единица
z = linspace(0, L, 1000); % диапазон интегрирования
% раасчитываем G(z)
g = G(n,z,lamda,L);
 
% рассчитываем подинтегральное выражение
% для каждого значения tetta
for j = 1:length(tetta)
    x(:,j) = exp( i*k0*z.*cos( tetta(j) ) - i.*g.*z ); 
end
 
% считаем интеграл по столбцам
f = trapz(x);
end
 
 
 
function g = G(n, z, lamda, L)
% Рассчитываем все параметры
m = 0.5;
z_opt = 1 + lamda/(2*L);
k0 = 2*pi/lamda;
G_opt = k0*z_opt;
delta = G_opt - k0;
delta_n = delta/10;
an = n*delta_n;
 
g = (G_opt - an) + an*sin(m*n*z/L);
end

Вот результат:
PS: Только очень прошу: прежде что-то менять, спроси у меня! Там много "подводных камней".
Ну и если будут вопросы - тоже задавай!

PPS: B еще по-идее функции F(tetta)и G(z) объединить, тогда код будет чуток короче и быстрее
1
0 / 0 / 0
Регистрация: 05.11.2012
Сообщений: 16
06.11.2012, 19:26  [ТС]
Большое тебе спасибо, действительно очень помог. Буду разбираться в коде = ) У меня есть несколько вопросов, ты создаешь матрицу значений с разными n, и потом их же строишь, так ведь? И вообще, много немножко поподробнее по реализации, что бы разобраться. XЧто за подводные камни = )
x(:,j) = exp( i*k0*z.*cos( tetta(j) ) - i.*g.*z );
что значат точки, после параметров в этой строке?

Спасибо тебе большое, еще раз. Ты правда очень помог ~
0
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
06.11.2012, 20:18
Пока еду с работы частично отвечу на твои вопросы.

Да, значения собираются в матрицу, где каждой строке соответствует свое значение n. Поэтому и графики получаются все в одном окне и разными цветами.
(Кстати, у меня параметр m постоянный и равен 0.5 - с ним нужно что-то делать?)

Кроме того интеграл считался тоже своеобразно: создавалась матрица значений подинтегральной ф-ции x(:,j), где каждый столбец j соответствует одному значению tetta, т.к. функция интегрирования trapz интегрирует матрицу по столбцам!
Одним из подводных камней является то, что это не программа, функция! Если сохранить ее в файле main.m, то ее можно вызвать из программы или прямо из командной строки:
Matlab M
1
>>main
Кроме того, как я только что упоминал мы работаем с матрицами, поэтому если где-то не в том месте поставить двоеточие или точку забыть - то получим либо ошибку либо ерунду.

Точка перед умножением/делением/степенью - это крайне важно! Если ее не поставить, то матлаб будет использовать матричное умножение деление и степень! А нам нужно поэлементное, поэтому ставим точку перед знаком действия. В противном случае вектор z при матричном перемножении с вектором g = G(z) дает в результате ошибку, матрицу или число (в зависимости от ориентации), которые потом складывается с вектором длинны z, поэтому в первом случае матлаб выдаст ошибку (сложение вектора и матрицы) , во втором посчитает не то, что хотелось бы.

Можешь поиграться с кол-вом точек массивов tetta (чем больше - тем более гладкий график) и кол-вом точек z - это шаг интегрирования, чем больше тем ближе результат к правде (ведь мы же считает приближенное значение интеграла!), но тем дольше будет считаться.

Вот и все на сегодня :)

Ответь по поводу m и еще вопрос: в формуле F(tetta) вся разность ik0zcos() - izG(z) идет в показателе експоненты?
1
0 / 0 / 0
Регистрация: 05.11.2012
Сообщений: 16
06.11.2012, 20:59  [ТС]
Да, все правильно, в формуле F(tetta) вся разность идет в показатели экспоненты. По-поводу точности, я уловил, тут все понятно.

Да, я тоже видел, что m постоянный параметр. В дальнейшем хотелось бы сделать его изменяемым, просто таких графиков требуется много, это были, так сказать, начальные тесты.

Просто в идеале, нужно что бы матлаб сохранял в файл, эти графике, ну это вроде как понятно. Вот вопрос в чем только. К примеру мы построили нужные нам значения при m=0.5, n=0...10. сохранили это в файл. Можно ли сделать так, что бы следом строился график при m=1, n=0...10, так же сохранялся в файл. И так 7 графиков с m = 0.5, 1, 2, 3, 4, 5, 10. Я подумал перенести m в цикл, в котором меняется n, и редактировать уже его. Т.е. как делал ты, сохранять в матрице значение m на n. Правильно ли я понимаю? Ну и потом элементарно сохранять их = ) по-поводу это действия и хотел проконсультироваться с тобой, можно же сделать так? Этим я не сломаю всю конструкцию.
0
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
06.11.2012, 21:10
Чтобы сделать двойной цикл по m и n нужно подправить функции F и G чтобы они принимали еще параметр m.
На данном этапе m можно менять вручную, получать пучок графиков (можно даже в самом графическом окне добавить надпись, что m=1, напрмер) и сохранить. (Есть даже отдельны функция сохранеия, которую можно вызвать програмно)

Кроме того, есть тут у меня еще одна безумная идея - собрать все функции в одну программу, задав значения m и n, чтобы сразу все посчитало и сохранило, но это уже другая история
1
0 / 0 / 0
Регистрация: 05.11.2012
Сообщений: 16
06.11.2012, 22:36  [ТС]
Вывел m в основную программу, вроде передает везде правильно, оцени.
Кликните здесь для просмотра всего текста
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
function main2
clear all
clc
lamda = 3;  
iL = 3;
L = iL*lamda;
tetta = linspace(0,pi,100); % диапазон значений tetta
n = 0:10; % диапазон значений n
m = 0.5;
for j = 1:length(n)
    y = abs( F(tetta,n(j),lamda,L,m) ); % считаем модуль F(tetta)
    f(:,j) = y / max(y); % нормируем
    t(:,j) = tetta;
    leg1(:,j) = {['n=',num2str(n(j))]};
end
% строим графики
plot(t,f)
title(['m=',int2str(m)]);
legend(leg1)
grid on
ylim([0 1.01])
xlim([0 pi])
xlabel('\theta')
ylabel('F(\theta)')
set(gca,'XTick',0:pi/4:pi)
set(gca,'XTickLabel',{'0','pi/4','pi/2','3*pi/4','pi'})
print ('-djpeg', '-r300', ['m=',int2str(m)])
% тут и фнкции конец!
% а кто понял - молодец! :)
end
 
 
 
function f = F(tetta, n, lamda, L,m)
% Рассчитываем вспомогательные параметры
z_opt = 1 + lamda/(2*L);
k0 = 2*pi/lamda;
G_opt = k0*z_opt;
delta = G_opt - k0;
delta_n = delta/10;
 
i = sqrt(-1); % мнимая единица
z = linspace(0, L, 1000); % диапазон интегрирования
% раасчитываем G(z)
g = G(n,z,lamda,L,m);
 
% рассчитываем подинтегральное выражение
% для каждого значения tetta
for j = 1:length(tetta)
    x(:,j) = exp( i*k0*z.*cos( tetta(j) ) - i.*g.*z ); 
end
 
% считаем интеграл по столбцам
f = trapz(x);
end
 
 
 
function g = G(n, z, lamda, L,m)
% Рассчитываем все параметры
z_opt = 1 + lamda/(2*L);
k0 = 2*pi/lamda;
G_opt = k0*z_opt;
delta = G_opt - k0;
delta_n = delta/10;
an = n*delta_n;
 
g = (G_opt - an) + an*sin(m*n*z/L);
end

Так же, добавил команду сохранения, вроде тоже все работает = ) но есть некоторые ошибки с названиями, при преобразовании m в int2str(m), т.е. в строку, почему-то происходит округление, т.е. 0.5 до 1, 1.5 до 2 (в названии графика и имени файла), как это можно побороть, вроде везде, в остальном правильное значение считает m=0.5.

И попробовал ввести m в цикл, подскажи, в чем ошибочка = )
Кликните здесь для просмотра всего текста
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
function main2
clear all
clc
lamda = 3;  
iL = 3;
L = iL*lamda;
tetta = linspace(0,pi,100); % диапазон значений tetta
n = 0:10; % диапазон значений n
m = [0.5 1 2 3 4 5 10];
for k = 1:length(m)
    for j = 1:length(n)
        y = abs( F(tetta,n(j),lamda,L,m(k)) ); % считаем модуль F(tetta)
        f(k,j) = y / max(y); % нормируем
        leg1(k,j) = {['n=',num2str(n(j))]};
    end
end
% строим графики
plot(t,f)
%title(['m=',int2str(m)]);
legend(leg1)
grid on
ylim([0 1.01])
xlim([0 pi])
xlabel('\theta')
ylabel('F(\theta)')
set(gca,'XTick',0:pi/4:pi)
set(gca,'XTickLabel',{'0','pi/4','pi/2','3*pi/4','pi'})
%print ('-djpeg', '-r300', ['m=',int2str(m)])
% тут и фнкции конец!
% а кто понял - молодец! :)
end
 
 
 
function f = F(tetta, n, lamda, L,m)
% Рассчитываем вспомогательные параметры
z_opt = 1 + lamda/(2*L);
k0 = 2*pi/lamda;
G_opt = k0*z_opt;
delta = G_opt - k0;
delta_n = delta/10;
 
i = sqrt(-1); % мнимая единица
z = linspace(0, L, 1000); % диапазон интегрирования
% раасчитываем G(z)
g = G(n,z,lamda,L,m);
 
% рассчитываем подинтегральное выражение
% для каждого значения tetta
for j = 1:length(tetta)
    x(:,j) = exp( i*k0*z.*cos( tetta(j) ) - i.*g.*z ); 
end
 
% считаем интеграл по столбцам
f = trapz(x);
end
 
 
 
function g = G(n, z, lamda, L,m)
% Рассчитываем все параметры
z_opt = 1 + lamda/(2*L);
k0 = 2*pi/lamda;
G_opt = k0*z_opt;
delta = G_opt - k0;
delta_n = delta/10;
an = n*delta_n;
 
g = (G_opt - an) + an*sin(m*n*z/L);
end

Исправил саму функцию main (переименовал в main2 для тестов), цикл, остальное не трогал. Ошибка же в строке, в которой не ожидал увидеть.
Subscripted assignment dimension mismatch.
Error in main2 (line 13)
f(k,j) = y / max(y); % нормируем
0
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
07.11.2012, 13:36
Первая программа составлена верно
Единственное нужно было использовать не int2str, а num2str! а то матлаб сначала преобразует m в целое (int), а потом в строку, поэтому и дробная часть теряется.
Вот второй ругается правильно. Рассмотрим обе части равенства f(k,j) = y/max(y):
y/max(y) - здесь y - массив значений, max(y) - макс. значение, т.е. число, в результате деления получаем массив.
А вот левая часть f(k,j) - здесь i, j индексы, т.е. числа, поэтому происходит обращение к одному элементу матрицы f, т.е. фактически ты пытаешься запихнуть массив y/max(y) в один элемент, поэтому вылазит ошибка.
Можно конечно написать f( k, j, : ) = y/max(y), т.е. сделать трехмерный массив f, но тгда возникнет геморой с рисованием графиков. Поэтому вот тебе такой вариант:
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
function main2
clc
lamda = 3;
iL = 3;
L = iL*lamda;
tetta = linspace(0,pi,100); % диапазон значений tetta
n = 0:10; % диапазон значений n
 
 
for m = [0.5 1 2 3 4 5 10];
    for j = 1:length(n)
        y = abs( F(tetta,n(j),lamda,L,m) ); % считаем модуль F(tetta)
        f(:,j) = y / max(y); % нормируем
        t(:,j) = tetta;
        leg1(:,j) = {['n=',num2str(n(j))]};
    end
    % строим графики
    h = figure;
    plot(t,f)
    title(['F(\theta) m=',num2str(m)]);
    legend(leg1)
    grid on
    ylim([0 1.01])
    xlim([0 pi])
    xlabel('\theta')
    ylabel('F(\theta)')
    set(gca,'XTick',0:pi/4:pi)
    set(gca,'XTickLabel',{'0','pi/4','pi/2','3*pi/4','pi'})
    
    ext = '.png'; % расширение
    file_name = ['F_tetta_m=', num2str(m), ext];  
    %Сохранение графика в файл c нужным расширением (смотри help)
    saveas(h, file_name); 
    close(h) %закрываем построенный график, чтоб не засорять память
end
% тут и фнкции конец!
% а кто понял - молодец! :)
end
 
 
 
function f = F(tetta, n, lamda, L,m)
% Рассчитываем вспомогательные параметры
z_opt = 1 + lamda/(2*L);
k0 = 2*pi/lamda;
G_opt = k0*z_opt;
delta = G_opt - k0;
delta_n = delta/10;
 
i = sqrt(-1); % мнимая единица
z = linspace(0, L, 1000); % диапазон интегрирования
% раасчитываем G(z)
g = G(n,z,lamda,L,m);
 
% рассчитываем подинтегральное выражение
% для каждого значения tetta
for j = 1:length(tetta)
    x(:,j) = exp( i*k0*z.*cos( tetta(j) ) - i.*g.*z );
end
 
% считаем интеграл по столбцам
f = trapz(x);
end
 
 
 
function g = G(n, z, lamda, L,m)
% Рассчитываем все параметры
z_opt = 1 + lamda/(2*L);
k0 = 2*pi/lamda;
G_opt = k0*z_opt;
delta = G_opt - k0;
delta_n = delta/10;
an = n*delta_n;
 
g = (G_opt - an) + an*sin(m*n*z/L);
end
Если написать print ('-djpeg', '-r300', ['F_tetta_m=',num2str(m)]), то при m=0.5 имя файла получается 'F_tetta_m=0.5' и матлаб думает, что 5 это расширение! А остальные, без точек, сохраняются в нужном графическом формате. Поэтому я решил расширение задавать вручную (см. строку 30). Кроме того, не рекомендую сохранять в jpg, т.к. этот формат при сжатии удаляет высшие гармоники изображения, из-за чего резкие переходы(линии) становятся размытыми. Этот формат лучше для фотографий, а для подобных графиков (ИМХО) лучше png.

Кстати, графики еще можно сделать в логарифмическом формате или в полярной системе

Добавлено через 39 минут
Как и обещал вчера - собрал все функции воедино и привел код в более-менее нормальный для матлаба вид:
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
clear
clc
 
lamda = 3;
iL = 3;
L = iL*lamda;
% рассчет вспом. параметорв
z_opt = 1 + lamda/(2*L);
k0 = 2*pi/lamda;
G_opt = k0*z_opt;
delta = G_opt - k0;
delta_n = delta/10;
 
 
tetta = linspace(0,pi,100); % диапазон значений tetta
n = 0:10; % диапазон значений n
 
for m = [0.5 1 2 3 4 5 10]; % значения m
    for j = 1:length(n)
        i = sqrt(-1); % мнимая единица
        z = linspace(0, L, 500); % диапазон интегрирования
        an = n(j)*delta_n;        
        % раасчитываем G(z)
        G = (G_opt - an) + an*sin(m*n(j)*z/L);
        % рассчитываем подинтегральное выражение
        % для каждого значения tetta
        for jj = 1:length(tetta)
            x(:,jj) = exp( i*k0*z.*cos( tetta(jj) ) - i.*G.*z );
        end
        % считаем интеграл по столбцам
        F = trapz(x); % значения ф-ции F(tetta)
        y = abs( F ); % считаем модуль F(tetta)
        f(:,j) = y / max(y); % нормируем
        t(:,j) = tetta;
        leg1(:,j) = {['n=',num2str(n(j))]};
    end
    % строим графики
    h = figure;
    plot(t,f)
    title(['F(\theta) m=',num2str(m)]);
    legend(leg1)
    grid on
    ylim([0 1.01])
    xlim([0 pi])
    xlabel('\theta')
    ylabel('F(\theta)')
    set(gca,'XTick',0:pi/4:pi)
    set(gca,'XTickLabel',{'0','pi/4','pi/2','3*pi/4','pi'})
 
    ext = '.png'; % расширение
    file_name = ['F_tetta_m=', num2str(m), ext];
    %Сохранение графика в файл c нужным расширением (смотри help)
    saveas(h, file_name);
    close(h) %закрываем построенный график, чтоб не засорять память
end
Итого получили всего 55 строк Кроме того время вычислений этой программы t1 = 15.8c, а функции t2 = 22.5c (при том, что они совершенно идентичны) - разница на лицо, как говорится
1
0 / 0 / 0
Регистрация: 05.11.2012
Сообщений: 16
07.11.2012, 18:58  [ТС]
Только с работы пришел = ) Посмотрел, что ты тут сделал, это просто фантастика, ты гуру матлаба. Эххх, надо тоже подтягивать его, пригодится потом = ) Код попозже посмотрю и если можно, то задам вопросики. Спасибо и правда, ты лучший = )

Кстати, а какие толковые книги есть по матлабу, что бы понять его более глубоко?
0
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
07.11.2012, 19:39
Настоящие гуру вообще не используют циклы) а для этого нужно не просто знать и понимать матричные действия, а "чувствовать" их! Мне всего лишь нравится решать интересные задачки и помогать няшкам ^__^
Сейчас может показаться странным, но я долго не мог осилить матлаб, хоть лихо строчил на C и BASIC (да я, изврашенец ^_^" ) в том числе и Visual-ах. Разобраться с ним мне очень помогла книга Сергиенко "Цифровая обработка сигналов", в которой даются основы работы с матлабом и множество примеров использования, хоть и специфических. Вот глянь это сообщение: https://www.cyberforum.ru/matl... ost3655576
Ну и короме книг - тренировки, курение help-а, медитации над чужим кодом))) Еще нужно быть достаточно ленивым, тогда код будет короче)
Кстати, последнюю программу можно еще оптимизировать по времени, если добавить пару строк инициализации матриц и избавиться от пары циклов, но не уверен, что это необходимо.
1
0 / 0 / 0
Регистрация: 05.11.2012
Сообщений: 16
27.03.2013, 14:42  [ТС]
А как можно реализовать нахождение уровня 0.707 от каждой прямой, каждого графика? Я так понимаю, что после получения значений MATLAB строит графики основываясь на точках, и просто соединяет их между собой. Т.е. если мы напрямую обратимся к значению 0.707 от каждой прямой, она нам ничего не выдаст, ибо фактически так нет точки, правильно ли я понимаю? А как тогда можно реализовать нахождение данных точек?

И еще вопросик, я тут немного доделал код, с которым вы, Зосима, любезно помогли мне = ) В общем я добавил ввод данных с клавиатуры, и кусочек кода для построение новых графиков D(n). Код располагается в варианте А-. Вот листинг:

Кликните здесь для просмотра всего текста
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
% -------------------------------------------------------------------------------------
function project_ant_ver_3_0
clear
clc
% -------------------------------------------------------------------------------------
% Задаем параметры
% -------------------------------------------------------------------------------------
l_ant=3; % Длинна антенны
parametr_t=1;
n=[0 1 2 3 4 5 6 7 8 9 10];
disp('Введите номер варианта для построения заданных графиков:')
var_number = input('1: A+    2: A-    3: B+    4: B- \n');
% -------------------------------------------------------------------------------------
% Предварительные вычисления
% -------------------------------------------------------------------------------------
lambda=3;
L=lambda*l_ant;
i=sqrt(-1);
k0=2*pi/lambda;
eps_opt=1+lambda/(2*L);
G_opt=k0*eps_opt;
delta=pi/L;
delta_n=delta/10;
% -------------------------------------------------------------------------------------
% Построение графиков
% -------------------------------------------------------------------------------------
tetta=linspace(0, pi, 2000);
z=linspace(0, L, 2000);
% -------------------------------------------------------------------------------------
switch var_number
    case 1 % A +
        disp('Выбран вариант A+, графики строятся...')
        for m=[0.5 1 2 3 4 5 10]
            for j=1:length(n)
                an=n(j)*delta_n;
                G=(G_opt-parametr_t*an)+an*sin(m*pi*z/L);
                for jj=1:length(tetta)
                    x(:,jj)=exp(i*k0*z.*cos(tetta(jj))-i.*G.*z);
                end
                F=trapz(x);
                y=abs(F);
                f(:,j)=y/max(y);
                t(:,j)=tetta;
                leg1(:,j)={['n=', num2str(n(j))]};
            end
            h=figure;
            plot(t,f)
            title(['F(\theta) A+ i=', num2str(l_ant),' t=', num2str(parametr_t),' m=', num2str(m)]);
            legend(leg1)
            grid on;
            ylim([0 1.01])
            xlim([0 pi])
            xlabel('\theta')
            ylabel('F(\theta)')
            set(gca,'XTick', 0:pi/4:pi)
            set(gca,'XTickLabel', {'0','pi/4','pi/2','3*pi/4','pi'})
            ext='.png';
            file_name=['A+_i=', num2str(l_ant),'_t=', num2str(parametr_t),'_m=', num2str(m), ext];
            saveas(h, file_name);
            close(h)
        end
        disp('Графики построены и сохранены в папке с программой. Выбрать новые параметры и построить графики для других вариантов?')
        restart_programm = input('1: Да    2: Нет \n');        
        switch restart_programm
            case 1
                project_ant_ver_3_0;
            otherwise 
                % exit;       
        end
    case 2 % A -
        disp('Выбран вариант A-, графики строятся...')
        for m=[0.5 1 2 3 4 5 10]
            for j=1:length(n)
                an=n(j)*delta_n;
                G=(G_opt-parametr_t*an)-an*sin(m*pi*z/L);
                for jj=1:length(tetta)
                    x(:,jj)=exp(i*k0*z.*cos(tetta(jj))-i.*G.*z);
                end
                F=trapz(x);
                y=abs(F);
                f(:,j)=y/max(y);
                t(:,j)=tetta;
                leg1(:,j)={['n=', num2str(n(j))]};
                % -------------------------------------------------------------------------------------
                % Нахождение значений графика D(n)
                % -------------------------------------------------------------------------------------
                for jjj=1:length(tetta)
                    d(:,jjj)=(f(jjj,j).^2)*sin(tetta(jjj));
                end
                D=trapz(d);
                D_rashetnoe(j)=2/D;
                D_graff(j)=D_rashetnoe(j)/D_rashetnoe(1);
                % -------------------------------------------------------------------------------------  
            end
            h=figure;
            plot(t,f)
            title(['F(\theta) A- i=', num2str(l_ant),' t=', num2str(parametr_t),' m=', num2str(m)]);
            legend(leg1)
            grid on;
            ylim([0 1.01])
            xlim([0 pi])
            xlabel('\theta')
            ylabel('F(\theta)')
            set(gca,'XTick', 0:pi/4:pi)
            set(gca,'XTickLabel', {'0','pi/4','pi/2','3*pi/4','pi'})
            ext='.png';
            file_name=['A-_i=', num2str(l_ant),'_t=', num2str(parametr_t),'_m=', num2str(m), ext];
            saveas(h, file_name);
            close(h)
            % -------------------------------------------------------------------------------------
            % Построение и сохранение графика D(n)
            % -------------------------------------------------------------------------------------
            h1=figure;
            plot(n,D_graff)
            grid on;
            file_name=['Dgraff_A-_i=', num2str(l_ant),'_t=', num2str(parametr_t),'_m=', num2str(m), ext];
            saveas(h1, file_name);
            close(h1)
            % -------------------------------------------------------------------------------------
        end
        disp('Графики построены и сохранены в папке с программой. Выбрать новые параметры и построить графики для других вариантов?')
        restart_programm = input('1: Да    2: Нет \n');        
        switch restart_programm
            case 1
                project_ant_ver_3_0;
            otherwise 
                % exit;       
        end
    case 3 % B +
        disp('B +')
    case 4 % B -
        disp('B -')
    otherwise
        disp('Неправильно задан вариант!!! Выбрать новые параметры и построить графики для других вариантов?')
        restart_programm = input('1: Да    2: Нет \n');
        switch restart_programm
            case 1
                project_ant_ver_3_0;
            otherwise 
                % exit;       
        end
end
end


Так вот, в чем собственно еще один вопрос? Как вы думаете, правильно ли я построил D(n), в этом у меня есть сомнения... Код вроде работает, но в маткаде выдает немного другие результаты. Общая формула для нахождения:
http://s1.ipicture.ru/uploads/... f6Z6T2.jpg
Функция в квадрате, эта та, от который мы брали интеграл выше. Количество графиков D(n) зависит от количества параметров m.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.03.2013, 14:42
Помогаю со студенческими работами здесь

Продифференцировать сложную функцию.
y=\ln{\sin{x}}-\frac{1}{2}\sin^2{x}

Записать сложную функцию
y(x)=g(f(x) f(x)=\frac{1}{\ln x} g(x)= {e}^{3x} Не пойму, что здесь делать, просто записать y(x)={e}^{3x}\frac{1}{\ln x}?

Вычислить сложную функцию
Помогите написать на языке Паскаля, эту функцию:

Вычислить сложную функцию
Задача на фото,проблема в том что не соображу как написать программу по функции "Произведение по Z от 1 до 15" (не ручаюсь за...

Добавить рекурсивную и сложную функцию
есть код программы все хорошо считает. надо изменить эту программу добавив в нее рекурсивную и сложную функцию и причем она должна также...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru