2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Mathematica, замена переменной в Table
Сообщение08.07.2018, 18:05 


19/04/18
28
очень был бы рад любой помощи с таким заданием:
1) дан текстовый файл. из него функцией ReadList получается список значений, затем применяется функция Flatten и затем этот "уплощенный список" значений (называем его z) структурируем по строкам и столбцам таким образом: обращаемся к элементу списка командой z[[1000*(i-1)+j]]. (имеем i от 1 до 256 и j от 1 до 1000, всего 256000 элементов списка, структурированных по строкам индексом i и столбцам индексом j).
2) есть возможность нарисовать зависимость z[[1000*(i-1)+j]]:
Код:
cnz1 = Table[ z1[[1000*(i - 1) + j]], {j, 37, 520, 1}, {i, 80, 180, 1} ];
MatrixPlot[cnz1];

(тут выбраны лишь некоторые из допустимых значений индексов по причинам, в которые нецелесообразно вникать)
3) наконец, сама задача.
есть переменная wav, которая через столбцовый индекс j выражается так:
Код:
wav = wavMin + j*Inc;

где wavMinи Inc - константы, j = 37..520 с шагом в 1.
команда z[[1000*(i-1)+j]] - функция интенсивности в зависимости от i и j.
а необходимо предоставить в математике функцию интенсивности в зависимости от i и wav с указанной выше связью wav и j.
и затем изобразить эту функцию командой MatrixPlot подобно тому, что было в п.2.
по сути: необходимо заменить в функции от дискретного переменного z столбец j на массив wav[j] и изобразить z[i,wav[j]].
опишу, какие шаги я предпринимал и с какими проблемами сталкивался:
1 способ:
составлял функцию j[wav]=IntegerPart[(wav-wavMin)Inc]+1; и создавал
Код:
wavMin = 1.232040;
Inc = 0.043127;
wavMax = wavMin + Inc*(520 - 37);
cnz1 = Table[
   z1[[1000*(i - 1) + IntegerPart[(wav - wavMin)/Inc] + 1]], {wav, wavMin, wavMax, Inc}, {i, 80, 180, 1} ];

но при вызове MatrixPlot[cnz1]график выводится с зависимостью z1 от j (то есть вертикальная ось занимает диапазон от 1 до (520-37), а не от wavMin до wavMax.
2 способ:
составлял
Код:
cnz1 = Table[
   z1[[1000*(i - 1) + j]], {j, 37, 520, 1}, {i, 80, 180, 1} ];

затем выполнял
Код:
funz1 = ListInterpolation[cnz1];

то есть получаем теперь уже функцию funz1[i,j] с непрерывно изменяющимися переменными, в котором необходимо j заменить на
Код:
IntegerPart[(wav - wavMin)/Inc] + 1.

тут я пробовал делать подобные манипуляции:
Код:
Funz1[wav, i] = funz1[IntegerPart[(wav - wavMin)/Inc] + 1, i];
tabcnz1 = Table[Funz1, {wav, wavMin, wavMax, Inc}, {i, 1, 101, 1} ];
MatrixPlot[tabcnz1];

но вышеприведенный код приводит к тому же, что и в первом способе, график отображается в диапазоне от 1 до 520-37.

 Профиль  
                  
 
 Posted automatically
Сообщение08.07.2018, 18:18 
Заслуженный участник


09/05/12
25179
 i  Тема перемещена из форума «Околонаучный софт» в форум «Карантин»
по следующим причинам:

- код длиной в несколько строк стоит оформить с использованием соответствующего тэга, отдельные обозначения и операторы размером в несколько символов - с помощью "моноширинного" тэга tt.

Исправьте все Ваши ошибки и сообщите об этом в теме Сообщение в карантине исправлено.
Настоятельно рекомендуется ознакомиться с темами Что такое карантин и что нужно делать, чтобы там оказаться и Правила научного форума.

 Профиль  
                  
 
 Posted automatically
Сообщение08.07.2018, 18:32 
Заслуженный участник


09/05/12
25179
 i  Тема перемещена из форума «Карантин» в форум «Околонаучный софт»

 Профиль  
                  
 
 Re: Mathematica, замена переменной в Table
Сообщение08.07.2018, 20:14 


06/01/16
18
В таблицах cnz1 или tabcnz1 нет никакой информации о том, в каком пределе меняются индексы, поэтому Mathematica считает, что они меняются от 1 до числа элементов в стобце таблицы (то есть 520-37). Так что есть два варианта:

1. Указать явно границы изменения переменных опцией DataRange
Код:
MatrixPlot[cnz1, DataRange -> {{wavMin, wavMax}, {80, 180}},  AxesLabel -> {"wav", "j"}]

2. Хранить значения переменных в таблице и строить график с помощью ListDensityPlot
Код:
cnz3 = Table[{wav, i,     z1[[1000*(i - 1) + IntegerPart[(wav - wavMin)/Inc] + 1]]}, {wav,
    wavMin, wavMax, Inc}, {i, 80, 180, 1}];
cnz3 = Flatten[cnz3, 1];
ListDensityPlot[cnz3, FrameLabel -> {"wav", "j"}]

 Профиль  
                  
 
 Re: Mathematica, замена переменной в Table
Сообщение08.07.2018, 20:46 


19/04/18
28
SharkAV, спасибо Вам большое, очень помогли!

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: DariaRychenkova


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group