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

Как интегрировать в матлаб?

17.05.2013, 18:15. Показов 15526. Ответов 90
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приступил к выполнению следующей РГР. Там появились интеграллы, как прописыватьв матлабе определенный интеграл?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.05.2013, 18:15
Ответы с готовыми решениями:

Открыть txt-файл при его формировании в матлаб и сохранении вне матлаб
С помощью операторов fopen, fprintf и fclose в файл "Press.txt" записана текстовая информация : variables={'1.Первый', ' 2.Второй',...

При запуске матлаб через какое-то время физическая память доходит до 100% и матлаб вырубается и происходит дамп
При запуске матлаб через какое-то время физическая память доходит до 100% и матлаб вырубается. При этом в нем не запускаются никакие файлы....

Как интегрировать с 1с
Кто имеет опыт интеграции 1с с дотнет библиотеками. Юзать Elisy или писать com-компонент? есть ли бесплатный аналог elisy для 8.2 - 8.3 ?

90
6 / 6 / 0
Регистрация: 14.06.2013
Сообщений: 100
26.06.2013, 22:25
Студворк — интернет-сервис помощи студентам
Круто, спасибо огромное, теперь разобрался с этим. Кажется основная ошибка в том что я не те аргументы функции передавал.

А можно парочку вопросов?

Вот там была строчка. Если ее так и оставить, то она выдаст матрицу значений.
Matlab M
1
Q(aa)=integral2(@func1,0,2*AA+1,0,2*AA+1,'Method',mtd);
Если убрать индексацию то почему то ошибка не вылезет, одна вылезет одно непонятное значение Q
Matlab M
1
Q=integral2(@func1,0,2*AA+1,0,2*AA+1,'Method',mtd);
И что самое странное, если дальше это самое Q или Q(aa) вводить в какие то еще действия, то без разницы, ответ все равно будет одинаковый?!?!

И еще. Я опять туплю с передачей аргументов.
Matlab M
1
2
3
4
5
6
7
8
9
10
function z=zzz(kk,ll)
     global c a b z kk ll
     z=kk+ll
                  function kk=kkkk(c,a)
                          kk=c.*a;
                  end
                 function ll=llll(c,b)
                          ll=c./b;
                  end
end
Matlab M
1
2
3
4
global c a b z kk ll
c=1;
b=2;
a=3;
Почему то в ответе он выдает ans= []. И никаких восклицаний с его стороны. Понять не могу почему так? вроде все верно
0
 Аватар для tvoretsmira
462 / 452 / 56
Регистрация: 28.05.2013
Сообщений: 699
27.06.2013, 01:09
Цитата Сообщение от jeka1226 Посмотреть сообщение
Matlab M
1
Q(aa)=integral2(@func1,0,2*AA+1,0,2*AA+1,'Method',mtd);
Здесь элементу массива Q, у которого номер aa присваивается значение. В цикле aa изменяется, поэтому каждый раз значения вычисленного интеграла присваиваются разным элементам массива. Таким образом получается массив.

Цитата Сообщение от jeka1226 Посмотреть сообщение
Matlab M
1
Q=integral2(@func1,0,2*AA+1,0,2*AA+1,'Method',mtd);
А тут ты присваиваеш одно значение вычисленого интеграла всей переменной Q. После этой операции массива уже нет. Q становится скаляром.

Цитата Сообщение от jeka1226 Посмотреть сообщение
И что самое странное, если дальше это самое Q или Q(aa) вводить в какие то еще действия, то без разницы, ответ все равно будет одинаковый?!?!
Какой ответ? какие действия? Не понял.

Цитата Сообщение от jeka1226 Посмотреть сообщение
Почему то в ответе он выдает ans= [].
Глобальные переменные инициализируются пустым массивом [] при их создании. Ты ничего этим переменным не приваивал, вот они и остались пустыми. Сложение 2-х пустых массивов тоже даёт пустой массив. Формально, никаких ошибок действительно нет, вот матлаб и молчит.

Добавлено через 1 час 52 минуты
Желательно воздержатся от использования глобальных переменных. Пока программы маленькие и простые конечно можно держать всё, что происходит с глобальными переменными, в памяти. Но если ты, предположим, передал программу для использования кому-то другому или вспомнил о своей проге через год, то в памяти уже ничего нет. Когда начнёш писать что-то по-больше начнутся проблемы. Рабочие пространства не просто так разделены, а для того, чтобы упростить читабельность и отладку сложных программ. В своих программах мне ни разу не приходилось использовать глобальных переменных.
2
6 / 6 / 0
Регистрация: 14.06.2013
Сообщений: 100
27.06.2013, 09:01
Вот смотри. Обрати внимание на AAA. В первом примере будет AAA а во втором AAA(aa,bb).

Matlab M
1
2
3
global A q Q QQQ AAA QQ AA
A=-2:1:2
q=-2:1:2

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function F5zn = funcF5zn(A,q)
global A q Q QQQ AAA QQ AA
for aa=1:length(A)
    for bb=1:length(q)
        QQ=q(bb);
        AA=A(aa);
  QQQ=QQ.*cos(AA)+AA.*sin(AA);
 AAA=QQ.*sin(AA)+AA.*cos(AA); 
   zn=AA*cos(AA);
  F5zn (aa,bb) =dblquad(@funcB5n,0,2*AAA+1+QQQ+zn,0,2*AAA+1+QQQ);
    end
end
AAA
F5zn
function B5n = funcB5n(xn,bn)
  x=xn.*cos(AA)+bn.*sin(AA)+zn;
  b=bn.*sin(AA)+xn.*cos(AA);
      B5n = QQ.*AA.*(x./abs(x)).*(b./abs(b))+zn;
B5n( (b==0)|(x==0) ) = zn;
  end
end

ВОт такой ответ:

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
AAA =
 
    0.9863
 
 
F5zn =
 
  415.9935  139.9977   19.8338   -4.4273    0.0560
    5.9904    0.0843   -0.0907   -0.3152   -3.3050
         0         0         0         0         0
   -0.9060   -0.3981    5.4664   45.0605  148.0412
   -8.9492    0.0438   -0.3090   -1.1657   16.3150
Теперь используем AAA(aa,bb)

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function F5zn2 = funcF5zn2(A,q)
global A q Q QQQ AAA QQ AA
    for aa=1:length(A)
    for bb=1:length(q)
      QQ=q(bb);
      AA=A(aa);
  QQQ(aa,bb)=QQ.*cos(AA)+AA.*sin(AA);
 AAA(aa,bb)=QQ.*sin(AA)+AA.*cos(AA); 
   zn=AA*cos(AA);
  F5zn2(aa,bb)=dblquad(@funcB5n2,0,2*AAA(aa,bb)+1+QQQ(aa,bb)+zn,0,2*AAA(aa,bb)+1+QQQ(aa,bb));
    end
end
AAA
 F5zn2
  function B5n2 = funcB5n2(xn,bn)
  x=xn.*cos(AA)+bn.*sin(AA)+zn;
  b=bn.*sin(AA)+xn.*cos(AA);
      B5n2 = QQ.*AA.*(x./abs(x)).*(b./abs(b))+zn;
B5n2( (b==0)|(x==0) ) = zn;
  end
end
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
AAA =
 
    2.6509    1.7416    0.8323   -0.0770   -0.9863
    1.1426    0.3012   -0.5403   -1.3818   -2.2232
         0         0         0         0         0
   -1.1426   -0.3012    0.5403    1.3818    2.2232
   -2.6509   -1.7416   -0.8323    0.0770    0.9863
 
 
F5zn2 =
 
  415.9935  139.9977   19.8338   -4.4273    0.0560
    5.9904    0.0843   -0.0907   -0.3152   -3.3050
         0         0         0         0         0
   -0.9060   -0.3981    5.4664   45.0605  148.0412
   -8.9492    0.0438   -0.3090   -1.1657   16.3150

В итоге получается что в первом случае ААА это скаляр, а во втором это массив. Однако результат функции, которая зависит от ААА и ААА(aa,bb) (это функции F5zn и F5zn2 соответственно) абсолютно не отличаются. Вот я и спрашиваю в чем здесь прикол? И не получится ли что однажды какая то из записей приведет к неправильному вычислению?



И еще. Что выходит что все глобальные переменные которые я когда либо создавал они так и хранятся дальше в памяти матлаба даже после окончания работы?? О_о Если да то как их удалить?
0
 Аватар для tvoretsmira
462 / 452 / 56
Регистрация: 28.05.2013
Сообщений: 699
27.06.2013, 10:21
Цитата Сообщение от jeka1226 Посмотреть сообщение
Однако результат функции, которая зависит от ААА и ААА(aa,bb) (это функции F5zn и F5zn2 соответственно) абсолютно не отличаются.
Результаты не должны отличатся, так как для расчёта используются одни и те же значения. Не важно откуда они взяты: со скаляра или с элемента двумерного массива.
Цитата Сообщение от jeka1226 Посмотреть сообщение
Вот я и спрашиваю в чем здесь прикол?
В том что тебе решать сохранить промежуточные расчёты циклов в переменной или нет. Если не сохранять то ААА будет содержать значение, которое является результатом выполнения последней итерации с индексом аа равным length(A) и bb=length(q).
Цитата Сообщение от jeka1226 Посмотреть сообщение
И не получится ли что однажды какая то из записей приведет к неправильному вычислению?
Нет, не получится. Вычисления от этого не зависят.

Цитата Сообщение от jeka1226 Посмотреть сообщение
И еще. Что выходит что все глобальные переменные которые я когда либо создавал они так и хранятся дальше в памяти матлаба даже после окончания работы?? О_о Если да то как их удалить?
Нет, после закрытия матлаба глобальные переменные стираются из памяти. Имелось ввиду что использование глобальных переменных может вызвать проблемы в течении одной сесии матлаба. Глобальные переменные хранятся после завершения выполнения функции/скрипта в глобальном рабочем пространстве. Конечно их можно стереть оттуда используя:
Matlab M
1
clear global A q Q QQQ AAA QQ AA
Если ты написал функцию, которая использует те же глобальные переменные что и предыдущая функция, то изменение глобальных переменных переменных в предыдущей функции влияет на результаты текущей.
Твои программы и тебе решать как их писать. Не понятно зачем я уговариваю тебя делать правильно?

Добавлено через 16 минут
Видишь, твой код программы уже плохо читается:
Цитата Сообщение от jeka1226 Посмотреть сообщение
Matlab M
1
2
function F5zn2 = funcF5zn2(A,q)
global A q Q QQQ AAA QQ AA
Создаётся обманчивое впечетление что funcF5zn2 использует входные аргументы A, q. Хотя на самом деле это не так:
Matlab M
1
2
3
4
global A q Q QQQ AAA QQ AA
A=-2:1:2
q=-2:1:2
F5zn2 = funcF5zn2(5,6)
От того, что я передал функции funcF5zn2 входные аргуметы 5 и 6 абсолютно ничего не изменилось. Туда можно всё что угодно написать и это не повлияет на результат.
2
6 / 6 / 0
Регистрация: 14.06.2013
Сообщений: 100
28.06.2013, 05:08
Спасибо большое, все очень доступно, разобраться можно))) Больше не использую команду global, придумал как по другому писать))

Правда вот тут вообще не понятно что не так.
Тут вот он еще считает, хотя ругается на особую точку.
Matlab M
1
2
3
4
5
6
7
8
9
function Q = powerF7yn(A)
Q = dblquad(@func1, 0,A,0,2)
 
function z = func1(x,y)
z = (x./abs(x))+(y./abs(y));
z((x==0))=0;
z((y==0))= 0;
end
end
А вот тут ошибку дает.
Matlab M
1
2
3
4
5
6
7
8
9
function Q = powerF7yn(A)
Q = dblquad(@func1, 0,A,0,2)
 
function z = func1(x,y)
z = (x./abs(x))+(y./abs(y));
z((x==0)) = (y./abs(y));
z((y==0)) =(x./abs(x));
end
end
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
???  In an assignment  A(I) = B, the number of elements in B and
 I must be the same.
 
Error in ==> powerF7yn>func1 at 7
z((y==0)) =(x./abs(x));
 
Error in ==> quad at 77
y = f(x, varargin{:});
 
Error in ==> dblquad>innerintegral at 78
    Q(i) = quadf(intfcn, xmin, xmax, tol, trace, y(i), varargin{:});
 
Error in ==> quad at 77
y = f(x, varargin{:});
 
Error in ==> dblquad at 54
Q = quadf(@innerintegral, ymin, ymax, tol, trace, intfcn, ...
 
Error in ==> powerF7yn at 2
Q = dblquad(@func1, 0,A,0,2)
Говорит число элементов не совпадает.

Я так понимаю тут фишка в различии размеров векторов? ну а как это исправить.
строка6: z((x==0)) = (y./abs(y)).*(x)./(x);
Так чтоли?

НЕ пойму что делать((

Добавлено через 11 минут
Тут конечно в сто раз проще разделить эту сумму на две разные функции и проинтегрировать по отдельности. А вот в таком контексте как у меня это возможно сделать? Ведь тогда число записей сокращается в два раза
0
 Аватар для tvoretsmira
462 / 452 / 56
Регистрация: 28.05.2013
Сообщений: 699
28.06.2013, 10:50
Цитата Сообщение от jeka1226 Посмотреть сообщение
Правда вот тут вообще не понятно что не так.
Тут вот он еще считает, хотя ругается на особую точку.
Любая арифметическая операция с нечисловым значением (NaN) даёт NaN. В том числе и сложение, как у тебя при расчёте z. Здесь дело в размерности. dblquad при интегрировании передаёт вектор x и скаляр y функции func1, которая в ответ обязана вернуть вектор размерности х. Если y равен нулю, то все значения z становятся NaN независимо от размерности x. Логические операции х==0 и y==0 дают вектор и скаляр соответственно, так как х вектор, а y скаляр. Т.е. z((x==0))=0; правильно, а z((y==0))= 0; - ошибка. Так как равенство y равно нулю приводит к нечисловым значениям во всём векторе z, z((y==0))= 0 делает замену на ноль только первого элемента.
Всё это можно своими глазами увидеть установив точку отладки в строке 8 с условим any(isnan(z)).
Правильно будет так:
Matlab M
1
2
3
4
5
6
7
8
9
function Q = powerF7yn(A)
Q = dblquad(@func1, 0,A,0,2)
 
function z = func1(x,y)
z = (x./abs(x))+(y./abs(y));
z((x==0))=0;
z(repmat(y==0,size(x)))= 0;
end
end
или так (логическая операция над вектором и скляром даёт вектор):
Matlab M
1
2
3
4
5
6
7
8
9
function Q = powerF7yn(A)
Q = dblquad(@func1, 0,A,0,2)
 
function z = func1(x,y)
z = x./abs(x)+y./abs(y);
z(x==0)=0;
z(y==zeros(size(x)))= 0;
end
end
или:
Matlab M
1
2
3
4
5
6
7
8
function Q = powerF7yn(A)
Q = dblquad(@func1, 0,A,0,2)
 
function z = func1(x,y)
z = (x./abs(x))+(y./abs(y));
z(x==0|y==0)=0;
end
end
или можно использовать integral2 вместо dblquad. Тогда строка z(x==0|y==0)=0; не понадобится, так как integral2 никогда не оценивает значение подинтегрального выражения на границах интегрирования.

Для следующего кода смотри обьяснения в комментариях
Matlab M
1
2
3
4
5
6
7
8
9
10
11
function Q = powerF7yn(A)
Q = dblquad(@func1, 0,A,0,2)
 
function z = func1(x,y)
z = (x./abs(x))+(y./abs(y));
z((x==0)) = (y./abs(y)); % Вектору можно присвоить скаляр, 
%тогда все элемента вектора станут равны скаляру
z((y==0)) =(x./abs(x)); % Одному элементу нельзя присваивать вектор, 
% если этот елемент, конечно, не элемента массива ячеек
end
end
Цитата Сообщение от jeka1226 Посмотреть сообщение
Тут конечно в сто раз проще разделить эту сумму на две разные функции и проинтегрировать по отдельности. А вот в таком контексте как у меня это возможно сделать?
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function Q = powerF9yn(A)
Q = 2*quadgk(@func1, 0,A)+A*quadgk(@func2, 0,2)
 
function z = func1(x)
z = x./abs(x);
% z(x==0) = 0;
end
 
function z = func2(y)
z = y./abs(y);
% z(y==0) =0;
end
 
end
2
6 / 6 / 0
Регистрация: 14.06.2013
Сообщений: 100
30.06.2013, 11:10
Спасибо большое за шикарное объяснение! Теперь ясно почему вот такая запись:
z(x==0|y==0)=0;
заменяет две первые)

Вот для четвертого кода.
z(repmat(y==0,size(x)))= (x./abs(x));
Если мы пишем вот так мы ведь как раз и создаем массив ячеек y=0 размерности x. По идее он и должен сделать подстановку в каждый элемент вектора z для каждого элемента вектора x, а не только для одного как у меня было. Но видимо в моих рассуждениях опять ошибка.

Вот почти тоже самое:
Matlab M
1
2
3
4
5
6
7
8
9
10
function Q = powerF7yn(A,a)
Q = dblquad(@func1, 0,A,0,2)
 
function z = func1(x,y)
z = (x./abs(x))+(y./abs(y))+a./abs(a);
z((x==0))=0;
z(repmat(y==0,size(x)))= 0;
z(repmat(a==0,size(x)))= 0;
end
end
Вот так то я надеюсь правильно, по крайней мере судя по тому что "a" это скаляр, все так и должно быть. Каждому элементу вектора x должно соответствовать нулевое значение z.

Есть еще одна интересная идея. Что если посчитать интеграл путем просчитывания площади под графиком заданном точками с известными координатами, а сами точки соединены прямыми линиями (ну на крайний случай сплайнами).
Ну что то простое:
x=0 0 1 1;
y=0 1 1 0;
Площадь должна быть 1

Нужна какая то готовая функция, а то писать самостоятельно гигантскую программу вычисляющую это дело методом треугольников вообще не вариант (доводилось это в старом добром excel делать).

Еще конечно можно попробовать апроксимировать точки функцией и взять ее интеграл, но как то уж слишком много дополнительных действий будет.
0
 Аватар для tvoretsmira
462 / 452 / 56
Регистрация: 28.05.2013
Сообщений: 699
30.06.2013, 13:33
Цитата Сообщение от jeka1226 Посмотреть сообщение
Если мы пишем вот так мы ведь как раз и создаем массив ячеек y=0 размерности x.
Нет массив ячеек мы не создаём. Откуда, вдруг, массив ячеек? y и 0 имеют класс double, результат сравнения y==0 имеет класс logical. Да и индексирование делают только с помощью переменных класса double и logical, cell для этого не подойдёт.
Цитата Сообщение от jeka1226 Посмотреть сообщение
По идее он и должен сделать подстановку в каждый элемент вектора z для каждого элемента вектора x, а не только для одного как у меня было.
Да, так и есть.
Цитата Сообщение от jeka1226 Посмотреть сообщение
Вот так то я надеюсь правильно, по крайней мере судя по тому что "a" это скаляр, все так и должно быть. Каждому элементу вектора x должно соответствовать нулевое значение z.
Разве для скаляра а этот код не работает? У меня считает правильно.
Цитата Сообщение от jeka1226 Посмотреть сообщение
Что если посчитать интеграл путем просчитывания площади под графиком заданном точками с известными координатами, а сами точки соединены прямыми линиями
Matlab M
1
Q=trapz(x,y);
Цитата Сообщение от jeka1226 Посмотреть сообщение
Ну что то простое:
x=0 0 1 1;
y=0 1 1 0;
Два значения функции для одного аргумента получается. По таким данным ни спайнов, ни интерполяции (кроме параметрической) не получится. Выбросим первую и последнюю точку. Ведь они нужны были для создания вертикальных прямых, которые и так подразумеваются при интегрировании.
Matlab M
1
2
x=[0 1];
y=[1 1];
Цитата Сообщение от jeka1226 Посмотреть сообщение
(ну на крайний случай сплайнами).
Почему на крайний? Тоже вариант, многие именно так и делают для экспериментально полученых данных x и y:
Matlab M
1
2
3
4
5
function Q = powerF15yn(x,y)
% pp=pchip(x,y); %Можно и полиномами Эрмита
pp=spline(x,y); %Можно и сплайном
Q=diff(fnval(fnint(pp),[min(x), max(x)]));
end
Цитата Сообщение от jeka1226 Посмотреть сообщение
Еще конечно можно попробовать апроксимировать точки функцией и взять ее интеграл, но как то уж слишком много дополнительных действий будет.
Matlab M
1
2
3
4
5
6
7
8
9
function Q = powerF16yn(x,y)
% aFittype = fittype('a*x+b')
aFittype = fittype('exp1') %как-то определился какой функцией апроксимировать
fitobject = fit(x(:),y(:),aFittype) %выполнил апроксимацию
Q = integral(@func1, min(x),max(x));
  function Result=func1(x)
  Result = feval(fitobject,x).';
  end
end
Набор стандартных моделей для апроксимации можно посмотреть здесь:
http://www.mathworks.com/help/... tting.html
2
6 / 6 / 0
Регистрация: 14.06.2013
Сообщений: 100
01.07.2013, 10:34
В общем возникла еще одна сложность. Теперь надо решить тоже самое но с поворотом координат. Получается что x,y,a преобразуются в xn,yn,an. Выражаться это будет примерно вот так

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function Q = powerF(D,an,A,B,Y)
Q = dblquad(@func1, 0,D,0,2)
 
function z = func1(xn,yn)
x=xn.*cos(A).*cos(B) - yn.*sin(A).*cos(B) + an.*sin(B);
y= xn.*(cos(A).*sin(B).*sin(Y)+sin(A).*cos(Y)) + yn.*( -sin (A).*sin(B).*sin(Y)+ cos(A).*cos(Y) ) - an.*cos(B).*sin(Y);
a= -xn.*( cos(A).*sin(B).*cos(Y)- sin(A).*sin(Y)) + yn.*( sin (A).*sin(B).*cos(Y) + cos(A).*sin(Y) ) + an.*cos(B).*cos(Y);
 
z = (x./abs(x))+(y./abs(y))+a./abs(a);
z((x==0))=0;
z(repmat(y==0,size(xn)))= 0;
z(repmat(a==0,size(xn)))= 0;
end
end
В общем то я понимаю что вся фишка опять таки в размерности векторов. Вектор x это сумма вектора, скаляра и скаляра. А затем создавать еще вектор от вектора это в корне не правильно (команда repmat).
Поэтому я решил сразу создать вектор yyn=repmat(yn,size(xn)); и aan=repmat(an,size(xn)); и выполнить замену вместо yn и an.

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function Q = powerF(D,an,A,B,Y)
Q = dblquad(@func1, 0,D,0,2)
 
function z = func1(xn,yn)
yyn=repmat(yn,size(xn));
aan=repmat(an,size(xn));
 
x=xn.*cos(A).*cos(B) - yyn.*sin(A).*cos(B) + aan.*sin(B);
y= xn.*(cos(A).*sin(B).*sin(Y)+sin(A).*cos(Y)) + yyn.*( -sin (A).*sin(B).*sin(Y)+ cos(A).*cos(Y) ) - aan.*cos(B).*sin(Y);
a= -xn.*( cos(A).*sin(B).*cos(Y)- sin(A).*sin(Y)) + yyn.*( sin (A).*sin(B).*cos(Y) + cos(A).*sin(Y) ) + aan.*cos(B).*cos(Y);
z = (x./abs(x))+(y./abs(y))+a./abs(a);
z((x==0))=0;
z((y==0))= 0;
z((a==0))= 0;
 
end
end
Проверьте плиз, правильно ли? Вроде работает но то ли он считает что нужно
0
 Аватар для tvoretsmira
462 / 452 / 56
Регистрация: 28.05.2013
Сообщений: 699
01.07.2013, 11:04
У меня оба кода работают на скалярах. Не пойму в чём вопрос. И как проверить, если нету значений D,an,A,B,Y?
0
6 / 6 / 0
Регистрация: 14.06.2013
Сообщений: 100
01.07.2013, 11:47
D=2;
A=0;
B=0;
Y=0;
an=[0 1]; % (для простоты поменять вручную)

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function Q = powerF1(D,an,A,B,Y)
Q = dblquad(@func1, 0,D,0,2)
 
function z = func1(xn,yn)
yyn=repmat(yn,size(xn));
aan=repmat(an,size(xn));
 
x=xn.*cos(A).*cos(B) - yyn.*sin(A).*cos(B) + aan.*sin(B);
y= xn.*(cos(A).*sin(B).*sin(Y)+sin(A).*cos(Y)) + yyn.*( -sin (A).*sin(B).*sin(Y)+ cos(A).*cos(Y) ) - aan.*cos(B).*sin(Y);
a= -xn.*( cos(A).*sin(B).*cos(Y)- sin(A).*sin(Y)) + yyn.*( sin (A).*sin(B).*cos(Y) + cos(A).*sin(Y) ) + aan.*cos(B).*cos(Y);
z = (x./abs(x))+(y./abs(y))+a./abs(a);
z((x==0))=0;
z((y==0))= 0;
z((a==0))= 0;
 
end
end
 
Q=0
Q=12

По идее первый код должен давать такие же ответы как и второй, потому как углы поворота равны 0. И он дает одинаковые ответы


D=2;
an= [0 1]; %(для простоты поменять вручную)

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function Q = powerF2(D,a)
Q = dblquad(@func1, 0,D,0,2)
 
function z = func1(x,y)
 
 z = (x./abs(x))+(y./abs(y))+a./abs(a);
z((x==0))=0;
z(repmat(y==0, size(x)))= 0;
z(repmat(a==0, size(x)))= 0;
 
end
end
 
Q=0
Q=12
Просто мне важно что бы в дальнейшем при изменении углов A B Y у меня ответ не был косячным.
0
 Аватар для tvoretsmira
462 / 452 / 56
Регистрация: 28.05.2013
Сообщений: 699
01.07.2013, 17:33
Замена переменных как-то должна была изменить пределы интегрирования. Ты какую заменну вводил? напиши формулы.
И лучше было бы разложить на суму интегралов. Особенно вот эту часть a./abs(a), так как она не зависит от переменных интегрирования, её ещё до замены надо было вынести за знаки интегралов.
0
6 / 6 / 0
Регистрация: 14.06.2013
Сообщений: 100
01.07.2013, 19:42
Изначально было вот так:
Matlab M
1
2
3
x=xn.*cos(A).*cos(B) - yn.*sin(A).*cos(B) + an.*sin(B);
y= xn.*(cos(A).*sin(B).*sin(Y)+sin(A).*cos(Y)) + yn.*( -sin (A).*sin(B).*sin(Y)+ cos(A).*cos(Y) ) - an.*cos(B).*sin(Y);
a= -xn.*( cos(A).*sin(B).*cos(Y)- sin(A).*sin(Y)) + yn.*( sin (A).*sin(B).*cos(Y) + cos(A).*sin(Y) ) + an.*cos(B).*cos(Y);
Матлаб сильно ругался на это дело.

Потом я вместо yn и an я написал вот это:

Matlab M
1
2
yyn=repmat(yn,size(xn));
aan=repmat(an,size(xn));
для того что бы dblquad смог взять интеграл в особых точках. И он перестал ругаться. Вот меня и интересует правильно ли это?

не, на сумму не буду раскладывать лишний раз, надо в общем виде решить.

а пределы интегрирования изменятся конечно, но это здесь не важно, ибо я знаю как там по простому сделать, ниче там сложного нету
0
 Аватар для tvoretsmira
462 / 452 / 56
Регистрация: 28.05.2013
Сообщений: 699
02.07.2013, 01:04
Цитата Сообщение от jeka1226 Посмотреть сообщение
Вот меня и интересует правильно ли это?
Правильно.
Хотя, конечно, не понятно на что там матлаб "ругался". Даже если вы не знаете английского, то что пишет матлаб несёт смысл и для меня и для других участников форума.
1
6 / 6 / 0
Регистрация: 14.06.2013
Сообщений: 100
03.07.2013, 22:46
Что то я на простом запарился(((

Matlab M
1
2
3
4
5
6
7
8
9
clear
x=0:0.1:10;
for xx=1:length(x)
y(xx)=x(xx).^2;
end
 
for zz=2:length(x)
z(zz)=trapz(0:0.1:x(zz),[B][I][U]y(zz)[/U][/I][/B])
end
Хочу построить график площади от длинны x. Что то торможу.
0
 Аватар для Зосима
5246 / 3574 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
03.07.2013, 23:18
Matlab M
1
2
3
4
5
6
7
8
9
clear
x=0:0.1:10;
for xx=1:length(x)
  y(xx)=x(xx).^2;
end
 
for zz=2:length(x)
  z(zz)=trapz(x(1:zz),y(1:zz))
end
Но наверно проще так:
Matlab M
1
2
3
4
x = 0:0.1:10;
y = x.^2;
z= cumtrapz(x,y);
plot(x,z)
*кстати оно совпадает с графиком u = x.^3/3
1
6 / 6 / 0
Регистрация: 14.06.2013
Сообщений: 100
15.07.2013, 15:10
Ага, с предыдущим все ясно)
А как с таким быть?

Matlab M
1
2
3
4
5
6
7
8
9
10
clear
F=[0 0 0; 1 1 1; 2 4 8; 3 9 27; 4 16 64];
p=0:4;
for ff=2:length(p)
  A(ff)=trapz(p(1:ff), F(1: ff));
end
figure 
plot(p, F )
figure
plot(p, A )
Он для А строит только дну кривую, а надо бы 3. Я что то долго соображал как это в цикл превратить но не придумал. Есть другие варианты?
0
 Аватар для tvoretsmira
462 / 452 / 56
Регистрация: 28.05.2013
Сообщений: 699
15.07.2013, 15:54
Всё правильно, вот ты интегрируеш какую-то функцию заданую пятью точками. У тебя же одно значение получается в результате, а не 5.
1
 Аватар для Зосима
5246 / 3574 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
15.07.2013, 16:07
jeka1226, а попробуй cumtrapz вместо trapz
*хотя не исключаю ошибки

Добавлено через 1 минуту
Matlab M
1
2
3
4
5
6
7
8
9
clear
F=[0 0 0; 1 1 1; 2 4 8; 3 9 27; 4 16 64];
p=0:4;
A = cumtrapz(p, F );
 
figure 
plot(p, F )
figure
plot(p, A )
1
6 / 6 / 0
Регистрация: 14.06.2013
Сообщений: 100
16.07.2013, 10:07
Да, все вроде работает как надо! проверял по каждому столбцу
Единственно, в справке почему то написано, что вектор p(ну в моем случае он p) должен быть столбцом...
Хотя что строка что столбец он одинаково считает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.07.2013, 10:07

Как интегрировать слайдер joomla?
Добрый вечер, имеется html-верстка в ней слайдер, каким способом его можно интегрировать в joomla при натяжке?Подскажите какие-нибудь уроки...

Как интегрировать Teamleader в PHP
Здравствуйте, пожалуйста, помогите. Надо интегрировать номер ключа API и номер группы Teamleader в PHP. Вот здесь они описывают как это...

Как интегрировать PHP в Parser3?
Возможно ли погрузить код запроса PHP прямо в Parser? Как это делается, чтобы он исполнялся? Нужно парсером получать результат...

Как Access интегрировать в 1С бухгалтерию?
Подскажите, пожалуйста как можно Access интегрировать в 1С бухгалтерию?

Как интегрировать сложные функции?
Например: Интеграл от cos3x^2 dx. ?


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru