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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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