уравнение Карплуса в гнуплоте - PullRequest
2 голосов
/ 08 июня 2011


Я хочу построить уравнение Карплуса

f(t)=a*cos(t+o)**2 + b*cos(t+o) + c 

с gnuplot для различных значений a, b, c, o. В частности, параметры a, b, c, o имеют табличную форму (в файле data.dat):

a b c o
1 2 3 60
4 5 6 180
-3 -5 -9 -120

и т имеет диапазон от

-180 to 180

для каждой строки в файле data.dat.

Вы можете мне помочь? Спасибо всем.

Лусио

Ответы [ 3 ]

3 голосов
/ 09 июня 2011

AFAIK Невозможно иметь «файл параметров» с другими параметрами для построения графика в функции, поскольку команда plot может либо использовать функцию для построения или файла данных:

plot {<ranges>}
     {<iteration>}
     {<function> | {"<datafile>" {datafile-modifiers}}}
     {axes <axes>} {<title-spec>} {with <style>}
     {, {definitions{,}} <function> ...}

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

set angles degrees
set xrange [-180:180]

f(x, a, b, c, o) = a*cos(x+o)**2 + b*cos(x+o) + c
title(n) = sprintf("f_%d", n)

plot a = 1 b = 2 c = 3 o = 60 f(x, a, b, c, o) t title(1), \
     a = 4 b = 5 c = 6 o = 180 f(x, a, b, c, o) t title(2), \
     a = -3 b = -5 c = -9 o = -120 f(x, a, b, c, o) t title(3)

Теперь вы указываете параметры напрямую и соответственно строите график функции.

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

plot for [a = 1:10:2] b = 2 c = 3 o = 60 f(x, a, b, c, o) t title(a)

К сожалению, в gnuplot невозможно вложить итерации, поэтому приходится иметь дело только с одним параметром для изменения.

1 голос
/ 09 июня 2011

Насколько я знаю, это невозможно.Что я делаю в этом случае, так это написание небольшого скрипта для генерации команд построения, которые мне нужны.Например, используя awk:

#! /usr/bin/env awk -f 

BEGIN {
    printf("plot ")
}

NR > 1 {
    printf(" ,\\\n     ")
}

{ 
    printf("(%s) * cos(t+(%s))**2 + (%s) * cos(t+(%s)) + (%s)", $1, $4, $2, $4, $3)  
}

END {
    printf("\n")
}

Сохраните его как файл karplus и сделайте его исполняемым.Затем ./karplus < data.dat создает нужную вам команду заговора.В зависимости от ваших потребностей, небольшой make-файл может быть в порядке.

1 голос
/ 09 июня 2011

Если вашим первым столбцом был «t» (а «a» был вашим вторым столбцом и т. Д.), Вы можете сделать:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...