Форум программистов, компьютерный форум, киберфорум
Наши страницы
Matlab
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
Ri
48 / 11 / 1
Регистрация: 15.09.2011
Сообщений: 87
1

Построение семейства кривых

06.10.2015, 17:49. Просмотров 1136. Ответов 4
Метки нет (Все метки)

Доброго времени суток! Прошу при возможности помочь мне разобраться в том, как построить семейство кривых в Matlab. Имеется код на С++:
C++
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
#include <iostream>
#include <cstdlib>
#include <math.h>
#include <stdio.h>
using namespace std;
 
int main(void)
{
double b0,Ym,f,hm,D,N;
printf("\nPolutolshina sloya Ym = "); scanf("%lf", &Ym);
printf("\nRabochaa chastota f = "); scanf("%lf", &f);
printf("\nVisota sloya hm = "); scanf("%lf", &hm);
printf("\nUgol vihoda v gradusax b0 = "); scanf("%lf", &b0);
N=pow(10, 12);//максимальная концентрация
double f0=sqrt(80.6*N);//вычисление критической частоты (8,976 МГц)
double F=f*pow(10, 6)/f0; //отношение рабочей частоты к критической
int re=6370;//радиус Земли
double Rm=hm+re;//значение r, при котором концентрация максимальна
double r0=Rm-Ym;  //начало слоя
double rad=b0/180 *M_PI;//угол выхода в радианах
double g=acos(re/r0*cos(rad));
double h1 = r0/(F*Ym);//вспом
double A= 1-(1/(F*F))+h1*h1;
double B=-(2*Rm*r0*r0)/(F*F*Ym*Ym);
double h2 = (Rm*r0)/(F*Ym);//вспом
double C=h2*h2-re*re*cos(rad)*cos(rad);
double M=B*B-4*A*C;//вспомогательная переменная для Д
double T=sin(g) +1.0/r0*sqrt(C) + 1.0/(2.0*sqrt(C)) * B;//вспомогательная переменная для Д
D=2*re*((g-rad)-(re*cos(rad))/(2*sqrt(C))*log(M/(4*C*T*T))); //расстояние скачка вдоль поверхности
 
printf("D = %.8g \n",D);
return 0;
}
Эта программа считает D, но одно Д для одной b0. Мне нужно построить семейство кривых D(b0) для разных параметров f0. В matlab говорят что сделать это легче. Я задала в файле саму функцию Д:
Matlab M
1
2
3
function D=func(b)
D=2*6370*((g-rad)-(6370*cos(rad))/(2*sqrt(C))*log(M/(4*C*T*T)))
end
А остальное вписывала в командную строку, ну пределы параметров, формулы, входящие в основную и тд. Что делаю не так? И как посоветуете осуществить? Не получается никак. Спасибо заранее, буду благодарна каждому ответу

Получиться должно подобное:
0
Миниатюры
Построение семейства кривых  
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2015, 17:49
Ответы с готовыми решениями:

Построение семейства резонансных кривых
Задание выглядит так: построить семейство резонансных кривых нелинейного осциллятора \ddot{x} +...

Суммирование семейства кривых в Матлаб
Пусть требуется вывести семейство кривых для x€ , которое задано функцией, зависящей от параметра ...

Построение семейства графиков
Здравствуйте, форумчане! Пришел к Вам за помощью. Знаю, что можно и самому, но чего-то не...

Построение фокусировочных кривых
Доброго времени суток:) Занимаюсь автофокусировкой опт. микроскопа. Мне надо сравнить некоторые...

Построение нескольких кривых одной функцией plot
Играюсь с одной анимацией в которой из-за большого количества обьектов начинает подтормаживать. В...

4
Centurio
Модератор
843 / 778 / 223
Регистрация: 13.09.2015
Сообщений: 2,758
06.10.2015, 18:30 2
Можно через цикл.
Matlab M
1
2
3
4
for k=8:20
  % вычисление вектора значений F=D(k)
  plot(b0,F), hold on
end
1
Зосима
5011 / 3367 / 332
Регистрация: 02.04.2012
Сообщений: 6,284
Записей в блоге: 16
Завершенные тесты: 1
09.10.2015, 12:31 3
Лучший ответ Сообщение было отмечено Ri как решение

Решение

и от меня вариантик
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
clear, clc
 
fx = 1:4:20; % набор значений частот, МГц
b0x = 0:90; % набор значений углов входа, градус
[f, b0] = meshgrid(fx, b0x); % рабочая частота, МГц
Ym = 100; % полутолщина слоя
hm = 500; % высота слоя
N = 1e12; %максимальная концентрация
f0 = sqrt(80.6*N); % вычисление критической частоты (8,976 МГц)
F = f*1e6/f0; % отношение рабочей частоты к критической
re = 6370; % радиус Земли
Rm = hm+re; % значение r, при котором концентрация максимальна
r0 = Rm-Ym;  % начало слоя
rad = b0/180*pi; %угол выхода в радианах
g = acos(re/r0*cos(rad));
h1 = r0./(F*Ym); % вспом
A = 1 - 1./F.^2 + h1.^2;
B = -2*Rm*r0.^2./(F.^2.*Ym.^2);
h2 = Rm*r0./(F*Ym); % вспом
C = h2.^2-re^2*cos(rad).^2;
M = B.^2-4*A.*C; % вспомогательная переменная для Д
T = sin(g) + 1/r0.*sqrt(C) + 1./(2*sqrt(C)).*B; % вспомогательная переменная для Д
D = 2*re*( (g-rad)-(re*cos(rad))./(2*sqrt(C)).*log(M./(4*C.*T.^2))); % расстояние скачка вдоль поверхности
 
plot(b0, abs(D))
grid on
xlabel('b_0, градус')
ylabel('D, м')
legend(strcat('f_0=',num2str(fx'),'МГц'))
1
Ri
48 / 11 / 1
Регистрация: 15.09.2011
Сообщений: 87
09.10.2015, 22:31  [ТС] 4
Огромное спасибо за Ваш вариантик)))Это супер!!!! Все получилось что надо) Я просто только осваиваю Matlab) В коде разобралась) ОГРОМНОЕ спасибо еще раз)
0
Ri
48 / 11 / 1
Регистрация: 15.09.2011
Сообщений: 87
12.10.2015, 23:51  [ТС] 5
Зосима, Я очень прошу прощения) Еще маленький такой вопрос) Как отсечь хвостики, которые после пиков получаются? Далее просто они в бесконечность постепенно уходят вверх
0
12.10.2015, 23:51
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2015, 23:51

Построение кривых второго порядка.Гипербола и парабола
Доброго времени суток! Помогите, пожалуйста, построить гиперболу и параболу. Я не могу построить т....

Построение кривых второго порядка (окружность, эллипс, парабола, гипербола)
общее задание: нужно построить гиперболу с заданными &quot;параметрами&quot; a и b, а также оси координат,...

Не получается построить огибающую семейства решений!
Есть дифференциальное уравнение y'+y^2=x^2 Я так понимаю, что для аналитического решения нужен...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru