|
0 / 0 / 0
Регистрация: 05.11.2012
Сообщений: 16
|
|||||||
Реализовать сложную функцию, с интегрированием и получением множества графиков.05.11.2012, 15:22. Показов 3244. Ответов 21
Метки нет (Все метки)
Добрый день, только начинаю осваивать matlab. И встал вопрос, можно ли как-то использовать переменные без их инициализации?
Как пример
Спасибо за ответ.
0
|
|||||||
| 05.11.2012, 15:22 | |
|
Ответы с готовыми решениями:
21
Реализовать сложную передаточную функцию в Simulink Как реализовать такую сложную анимацию? Большие числа java, реализовать не сложную формулу |
|
|
||||||
| 05.11.2012, 15:44 | ||||||
|
А можно поподробней о задании?
Впринципе можно сделать файл-функцию myfun.m:
1
|
||||||
|
0 / 0 / 0
Регистрация: 05.11.2012
Сообщений: 16
|
||
| 05.11.2012, 16:00 [ТС] | ||
|
Задание в целом, достаточно объемное и связанно с расчетами антенн. Но если вкратце, то для начала, нужно найти функцию выше, потом меняя параметры m и n, подставлять ее в интеграл и рассчитывать его, а после нормировать и строить графики.
Сделал, по вашему совету, но возникла новая проблема.
0
|
||
|
|
|||||||||||||||||||||
| 05.11.2012, 16:25 | |||||||||||||||||||||
|
Дык надо было z указать!
![]() Еще раз: 1. Создаем файл-функцию myfun.m:
2. В том же каталоге пишем программу prog.m которая использует ф-цию myfun:
![]() Добавлено через 4 минуты А если тебе надо менять еще m и n, то можно сделать функцию еще и от них:
2
|
|||||||||||||||||||||
|
0 / 0 / 0
Регистрация: 05.11.2012
Сообщений: 16
|
||||||
| 05.11.2012, 16:58 [ТС] | ||||||
|
Спасибо, щас попробую дописать программу до конца, вы очень помогли
![]() Попробовал дописать программу, но опять переменная z неизвестна... Нужно создать отдельную функцию для выражения F(tetta), правильно ли я понял?
0
|
||||||
|
|
|
| 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 [ТС] | ||
|
В общем постараюсь написать в формулах.
Ну да, по-поводу с, вы безусловно правы, привык к нему, но столь много математических операций, все же лучше, выполнить в матлабе. Просто привык к заглавным функциям, и хотелось для наглядности расположить все в одном m файле.
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. Хотя на шаге вычисления функция, все значения вроде как нормальные.
В чем может быть ошибка в вычислении интеграла? Ведь на подготовительных этапах, функция выдает значения. К примеру
0
|
|||||||
|
|
||||||
| 05.11.2012, 21:41 | ||||||
|
syms лучше не использовать, т.к. в этом случае результат получается не число, а в символьном формате! Поэтому и результат может быть нулевым.
И не стоит писать директиву function main в скрипт-файле, т.к. она служит для обозначени файл-функций и встроенных функций, которые живут своей отдельной жизнью в "параллельной вселенной" памяти. Это все-равно, что дать тебе лом и сказать заметать))) И глобальные переменные тут не нужны. Matlab такая своеобразная штука, что вначале нужно определить массив входных значений и на их основе посчитать массивы результатов (заметь, нигде ни слова о функциях!). И еще такой момент: интеграл функции на промежутке это число, одно единственное! Поэтому и результат:
Потерпи до завтра и я все распишу и нарисую! :)
2
|
||||||
|
|
||||||
| 06.11.2012, 11:33 | ||||||
|
Фуф!
Победил! ![]() Чтобы все было в одном файле пришлось таки оставить function main. Кликните здесь для просмотра всего текста
Вот результат: PS: Только очень прошу: прежде что-то менять, спроси у меня! Там много "подводных камней". Ну и если будут вопросы - тоже задавай! ![]() PPS: B еще по-идее функции F(tetta)и G(z) объединить, тогда код будет чуток короче и быстрее
1
|
||||||
|
0 / 0 / 0
Регистрация: 05.11.2012
Сообщений: 16
|
||
| 06.11.2012, 19:26 [ТС] | ||
|
Большое тебе спасибо, действительно очень помог. Буду разбираться в коде = ) У меня есть несколько вопросов, ты создаешь матрицу значений с разными n, и потом их же строишь, так ведь? И вообще, много немножко поподробнее по реализации, что бы разобраться. XЧто за подводные камни = )
Спасибо тебе большое, еще раз. Ты правда очень помог ~
0
|
||
|
|
||||||
| 06.11.2012, 20:18 | ||||||
|
Пока еду с работы частично отвечу на твои вопросы.
Да, значения собираются в матрицу, где каждой строке соответствует свое значение n. Поэтому и графики получаются все в одном окне и разными цветами. (Кстати, у меня параметр m постоянный и равен 0.5 - с ним нужно что-то делать?) Кроме того интеграл считался тоже своеобразно: создавалась матрица значений подинтегральной ф-ции x(:,j), где каждый столбец j соответствует одному значению tetta, т.к. функция интегрирования trapz интегрирует матрицу по столбцам! Одним из подводных камней является то, что это не программа, функция! Если сохранить ее в файле main.m, то ее можно вызвать из программы или прямо из командной строки:
Точка перед умножением/делением/степенью - это крайне важно! Если ее не поставить, то матлаб будет использовать матричное умножение деление и степень! А нам нужно поэлементное, поэтому ставим точку перед знаком действия. В противном случае вектор 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
|
|
|
|
|
| 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 в основную программу, вроде передает везде правильно, оцени.
Кликните здесь для просмотра всего текста
Так же, добавил команду сохранения, вроде тоже все работает = ) но есть некоторые ошибки с названиями, при преобразовании m в int2str(m), т.е. в строку, почему-то происходит округление, т.е. 0.5 до 1, 1.5 до 2 (в названии графика и имени файла), как это можно побороть, вроде везде, в остальном правильное значение считает m=0.5. И попробовал ввести m в цикл, подскажи, в чем ошибочка = ) Кликните здесь для просмотра всего текста
Исправил саму функцию main (переименовал в main2 для тестов), цикл, остальное не трогал. Ошибка же в строке, в которой не ожидал увидеть.
0
|
||||||||||||
|
|
|||||||||||
| 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, но тгда возникнет геморой с рисованием графиков. Поэтому вот тебе такой вариант:
А остальные, без точек, сохраняются в нужном графическом формате. Поэтому я решил расширение задавать вручную (см. строку 30). Кроме того, не рекомендую сохранять в jpg, т.к. этот формат при сжатии удаляет высшие гармоники изображения, из-за чего резкие переходы(линии) становятся размытыми. Этот формат лучше для фотографий, а для подобных графиков (ИМХО) лучше png.Кстати, графики еще можно сделать в логарифмическом формате или в полярной системе ![]() Добавлено через 39 минут Как и обещал вчера - собрал все функции воедино и привел код в более-менее нормальный для матлаба вид:
Кроме того время вычислений этой программы t1 = 15.8c, а функции t2 = 22.5c (при том, что они совершенно идентичны) - разница на лицо, как говорится
1
|
|||||||||||
|
0 / 0 / 0
Регистрация: 05.11.2012
Сообщений: 16
|
|
| 07.11.2012, 18:58 [ТС] | |
|
Только с работы пришел = ) Посмотрел, что ты тут сделал, это просто фантастика, ты гуру матлаба. Эххх, надо тоже подтягивать его, пригодится потом = ) Код попозже посмотрю и если можно, то задам вопросики. Спасибо и правда, ты лучший = )
Кстати, а какие толковые книги есть по матлабу, что бы понять его более глубоко?
0
|
|
|
|
|
| 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). Код располагается в варианте А-. Вот листинг: Кликните здесь для просмотра всего текста
Так вот, в чем собственно еще один вопрос? Как вы думаете, правильно ли я построил D(n), в этом у меня есть сомнения... Код вроде работает, но в маткаде выдает немного другие результаты. Общая формула для нахождения: http://s1.ipicture.ru/uploads/... f6Z6T2.jpg Функция в квадрате, эта та, от который мы брали интеграл выше. Количество графиков D(n) зависит от количества параметров m.
0
|
||||||
| 27.03.2013, 14:42 | |
|
Помогаю со студенческими работами здесь
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 .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|