Интеграл Matlab по функции символьной матрицы

В попытке ускорить циклы for (или исключить все вместе) я пытался передать матрицы в функции. Я должен использовать синус и косинус, а также. Однако, когда я пытаюсь найти интеграл матрицы, элементы которой состоят из синусов и косинусов, это не работает, и я не могу найти способ сделать это.

У меня есть матрица SI, состоящая из синусов и косинусов относительно переменной, которую я определил с помощью Symbolic Math Toolbox. Таким образом, было бы даже лучше, если бы я мог просто передать матрицу SI и получить матрицу значений, которая является интегралом функции синуса/косинуса в каждом месте этой матрицы. По сути, я бы вернул квадратную матрицу. Я не уверен, правильно ли я это сформулировал, но у меня есть следующий код, с которого я начал.

I = [1 2; 3 4];
J = [5 6; 7 8];
syms o;
j = o*J;
SI = sin(I + j);
%SI(1,1) = sin(5*o + 1)
integral(@(o) o.*SI(1,1), 0,1);

В идеале я хотел бы решить integral(@(o) o*SI,0,1) и получить матрицу значений. Что мне здесь делать?


person Kyle    schedule 17.06.2014    source источник
comment
Честно говоря, я понятия не имею, для чего предназначен ваш код. Вы пытаетесь определить функцию SI(o)=... и получить интеграл от SI от 0 до 1? Если вы пытаетесь ускорить код, использование символьной математики обычно не является хорошей идеей.   -  person Daniel    schedule 17.06.2014
comment
Альтернативой в моем фактическом коде является несколько вложенных циклов for, есть ли альтернатива символьной математике, о которой я не знаю? Мне нужен интеграл(@(o) o.*sin((квадратная матрица) + o*(квадратная матрица) + квадратная матрица), -1/2, 1/2) В настоящее время я запускаю два вложенных для циклов для повторения каждого элемента в квадратных матрицах. Мне нужно сделать это для 8 интегралов, что занимает гораздо больше времени, чем это практично.   -  person Kyle    schedule 17.06.2014
comment
Пожалуйста, опишите это словами/на математическом уровне. Неработающий код не говорит мне, что вы пытаетесь сделать.   -  person Daniel    schedule 18.06.2014
comment
У меня есть 3 квадратных матрицы NxN, A, B, C. Мне нужно интегрировать по длине, что обеспечивает мои ограничения. Интеграл является целым (osin(A + oB + C)do). Я хочу применить эту функцию, чтобы вернуть матрицу NxN. В настоящее время я использую два цикла for для перебора каждого элемента, и это очень медленно. Извините, я, кажется, изо всех сил пытаюсь выразить это словами.   -  person Kyle    schedule 18.06.2014
comment
@Kyle - это объяснение помогло. Я предоставил ответ для вас. Удачи.   -  person rayryeng    schedule 18.06.2014
comment
@Daniel - я отредактировал вопрос, чтобы сделать его более понятным на основе комментариев ОП. Я считаю, что я адекватно ответил на вопрос.   -  person rayryeng    schedule 18.06.2014


Ответы (1)


Учитывая, что все A, B и C являются матрицами N x N, на данный момент давайте предположим, что все они являются матрицами 2 x 2, чтобы сделать пример, который я иллюстрирую, более кратким для понимания. Давайте также определим o как математический символ на основе ваших комментариев в вашем вопросе выше.

syms o;
A = [1 2; 3 4];
B = [5 6; 7 8];
C = [9 10; 11 12];

Давайте также определим вашу функцию f в соответствии с вашими комментариями:

f = o*sin(A + o*B + C)

Таким образом, мы получаем:

f =

[ o*sin(5*o + 10), o*sin(6*o + 12)]
[ o*sin(7*o + 14), o*sin(8*o + 16)]

Помните, что для каждого элемента в f мы берем соответствующие элементы в A, B и C и складываем их вместе. Таким образом, для первой строки и первого столбца каждой матрицы у нас есть 1, 5 и 9. Таким образом, A + o*B + C для первой строки, первого столбца равно: 1 + 5*o + 9 = 5*o + 10.

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

out = int(f,a,b);

Это позволит интегрировать f для каждого элемента от нижней границы a до верхней границы b. Таким образом, предположим, что наши ограничения были от 0 до 1, как вы сказали. Следовательно:

out = int(f,0,1);

Таким образом, мы получаем:

out =

[ sin(15)/25 - sin(10)/25 - cos(15)/5, sin(18)/36 - sin(12)/36 - cos(18)/6]
[ sin(21)/49 - sin(14)/49 - cos(21)/7, sin(24)/64 - sin(16)/64 - cos(24)/8]

Имейте в виду, что out определяется в наборе инструментов символьной математики. Если вам нужны фактические числовые значения, вам нужно привести ответ к double. Следовательно:

finalOut = double(out);

Таким образом, мы получаем:

finalOut =

0.1997   -0.1160
0.0751   -0.0627

Очевидно, это можно обобщить для матриц M x N любого размера, если они все имеют одинаковые размеры.

Предостережение

sin, cos, tan и другие связанные функции имеют свои единицы измерения в радианах. Если вам нужен эквивалент градусов, добавьте d в конце функции (например, sind, cosd, tand и т. д.).


Я считаю, что это ответ, который вам нужен. Удачи!

person rayryeng    schedule 18.06.2014
comment
@Kyle - Вам нужна дополнительная помощь? - person rayryeng; 19.06.2014