• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Помогите, пожалуйста, с элементарным вопросом

Вопрос теперь такой: умеет ли Паскаль решать уравнения? Например в моем случае может ли Паскаль найти х при которых y=0 ?
 
Windows вылетает RunTime Error, DOS сейчас попробовать не могу, но всё равно спасибо, потом посмотрю.
И Ваш итог совершенно не похож на исходную версию ;)
Например в моем случае может ли Паскаль найти х при которых y=0 ?
Ну, численные методы - это наше всё...
Тупой перебор с минимальными итерациями или любыми другими методами, равно как и их комбинациями, рано или поздно даст искомый результат :)))
 
Программа не работает. Объясните пожалуйста почему. Как задать y, чтобы все заработало? Необходимо решение именно в таком алгоритме.

var
i:Integer;
x:Real;
y:array [1..1000] of Real;


begin
for i:=1 to 720 do
x:=i*3.14/180;
y:=sin(x);
if y[i-1]<0 and y>0 then
x:=(x[i-1]+x)/2;
writeln(x);
end.

Да, ребята, занесло вас. Вот стоит отвлечься на вечерок...
Функции тут - лишняя сущность. Всё бы ничего в программе, только вот...
Целая куча ГРУБЕЙШИХ ошибок.
1. Переменную х Вы определили, как простую скалярную. Поэтому обращаться с ней, как с массивом, НЕЛЬЗЯ. Массив следует ввести отдельно, в нижеприведенном варианте он назван "z".
2. Вы определили массив y в диапазоне индексов ОТ ЕДИНИЦЫ. Далее Вы запускаете цикл от 1 до 720. И в этом цикле:
а) У Вас y:=sin(x);, а надо y:=sin(x);
б) при i=1 обращение к y[i-1] есть обращение к y[0], а такое значение индекса массива НЕДОПУСТИМО при Вашем диапазоне. Поэтому следует ОТДЕЛЬНО вычислить z[1] и y[1], а потом запустить цикл, начинающийся с 2.
3. При задании логических условий в условном операторе (if ... then), если этих условий больше одного и они связаны отношениями OR или AND, эти условия следует писать в скобках.
4. В телах циклов и операторов выбора в случае, если действий больше одного, эти действия необходимо заключать в операторные скобки begin ... end.

Кстати, не ошибка, но в Паскале есть константа (формально - функция), возвращающая значение числа "пи". Зовут её Pi. Определять её не надо. Т.е. х можно вычислять так:
x:=i*Pi/180;

Исходя из всего вышесказанного:
Код:
var
 i:Integer;
 x:Real;
 y,z:array [1..1000] of Real;


begin
 z[1]:=Pi/180;
 y[1]:=sin(z[1]);
 for i:=2 to 720 do
  begin
   z[i]:=Pi*3.14/180*i;
   y[i]:=sin(z[i]);
   if (y[i-1]<0) and (y[i]>0) then
    begin
     x:=(z[i-1]+z[i])/2;
     writeln('x = ',x:8:5,'     y = ',sin(x):8:5);
    end;
  end;
 Readln
end.
 
Добрый день, Владимир. Спасибо за ответ!
В вашей строчке
z:=Pi*3.14/180*i;
как я понимаю 3.14 лишнее)
К слову начал использовать Pi вместо 3.14 и подметил, что косинус 270 градусов паскаль почему-то считает некоректно. Мне выдает 3.63...Е-12
 
В вашей строчке z:=Pi*3.14/180*i; как я понимаю 3.14 лишнее)
Разумеется! И как это я пропустил...
К слову начал использовать Pi вместо 3.14 и подметил, что косинус 270 градусов паскаль почему-то считает некоректно. Мне выдает 3.63...Е-12
Это странно. Мой Паскаль выдает 1.897...Е-19.tehno015
 
Владимир, а если в нашем примере "y" помимо z зависил бы также например от некой функции E[n], тогда следует писать
y[i,n]= {например} z + E[n];
 
Владимир, а если в нашем примере "y" помимо z зависил бы также например от некой функции E[n], тогда следует писать
y[i,n]= {например} z + E[n];

Простите, но ничего не понял. Сформулируйте задачу полностью.
 
в Паскале есть константа (формально - функция), возвращающая значение числа "пи". Зовут её Pi.

Давным давно надо определить свои константы, не зависящие от версии Pascal/Delphi/Lazarus/FreePascal и с большей точностью.
Пример:

Код:
  mcPi        = 3.14159265358979323846      +        { Pi (200 digits)           }
              0.26433832795028841971e-20  +        {                           }
              0.69399375105820974944e-40  +        {                           }
              0.59230781640628620899e-60  +        {                           }
              0.86280348253421170679e-80  +        {                           }
              0.82148086513282306647e-100 +        {                           }
              0.09384460955058223172e-120 +        {                           }
              0.53594081284811174502e-140 +        {                           }
              0.84102701938521105559e-160 +        {                           }
              0.64462294895493038196e-180;         {                           }
  mcPi2       = 6.283185307179586476925286766559006; { Pi * 2                    }
  mcPi3       = 9.424777960769379715387930149838509; { Pi * 3                    }
  mcPi4       = 12.56637061435917295385057353311801; { Pi * 4                    }
  mcPiOn2     = 1.570796326794896619231321691639751; { Pi / 2                    }
  mcPiOn3     = 1.047197551196597746154214461093168; { Pi / 3                    }
  mcPiOn4     = 0.785398163397448309615660845819876; { Pi / 4                    }
  mcPiSq      = 9.869604401089358618834490999876151; { Pi^2                      }
  mcPiE       = 22.45915771836104547342715220454374; { Pi^e                      }
  mcLnPi      = 1.144729885849400174143427351353059; { Ln (Pi)                   }
  mcLogPi     = 0.497149872694133854351268288290899; { Log (Pi)                  }
  mcSqrtPi    = 1.772453850905516027298167483341145; { Sqrt (Pi)                 }
  mcSqrt2Pi   = 2.506628274631000502415765284811045; { Sqrt (2 * Pi)             }
  mcLnSqrt2Pi = 0.918938533204672741780329736405618; { Ln (Sqrt (2 * Pi))        }
  mcRadPerDeg = 0.017453292519943295769236907684886; { Pi / 180                  }
  mcDegPerRad = 57.29577951308232087679815481410517; { 180 / Pi                  }
  mcE         = 2.718281828459045235360287471352663; { e                         }
  mcE2        = 7.389056098930650227230427460575008; { e^2                       }
  mcExpM2     = 0.135335283236612691893999494972484; { e^-2                      }
  mcLn2       = 0.693147180559945309417232121458177; { Ln (2)                    }
  mcLn10      = 2.302585092994045684017991454684364; { Ln (10)                   }
  mcLogE      = 0.434294481903251827651128918916605; { Log (e)                   }
  mcLog2      = 0.301029995663981195213738894724493; { Log (2)                   }
  mcLog3      = 0.477121254719662437295027903255115; { Log (3)                   }
  mcSqrt2     = 1.414213562373095048801688724209698; { Sqrt (2)                  }
  mcSqrt3     = 1.732050807568877293527446341505872; { Sqrt (3)                  }
  mcSqrt5     = 2.236067977499789696409173668731276; { Sqrt (5)                  }
  mcSqrt7     = 2.645751311064590590501615753639260; { Sqrt (7)                  }
 
Паскаль не Ваш - потрудитесь приводить версию.
Вы забыли добавить "милсдарь", а также уведомить меня, что Вы к моим услугам.
Давным давно надо определить свои константы, не зависящие от версии Pascal/Delphi/Lazarus/FreePascal и с большей точностью.
А эта сентенция к кому обращена? Ко мне? К разработчикам ЯП? Ежели ко мне, то мне почему-то кажется, что создание библиотек констант, функций, модулей и т.п. определяется моими в оных потребностями, а не абстракциями типа "давно пора".
P.S. Кстати, библиотеки у меня изрядные: спецфункции и т.п. Поскольку нужны реально. А вот особой потребности, скажем, в Ln(π) как-то вот не испытываю. Извините.
 
К слову начал использовать Pi вместо 3.14 и подметил, что косинус 270 градусов паскаль почему-то считает некоректно. Мне выдает 3.63...Е-12
Это странно. Мой Паскаль выдает 1.897...Е-19.
Господа, да вы шутите? С очень высокой точностью вы оба получили нуль! Я уверен, что вы знаете как сравниваются вещественные числа, но если вдруг нет... Никогда не сравнивайте вещественные числа напрямую, только если не надо сравнивать на больше или меньше. Равенство вещественных чисел проверяют по вычитанием одного числа из другого, взятия модуля и сравнения с малой константой. Как-то так:

if Abs(x1 - x2) > 0.0000001 then

Иначе можете нарваться на ситуацию, когда

0.1 + 0.2 != 0.3

Простите за оффтоп.
В Паскале с его синтетическим типом Real вообще, на мой скромный взгляд, беда. Он ни аппаратно не поддерживается, да ещё и требует затрат времени на конвертации. А при подключении поддержки сопроцессора так вообще превращается в Extended! На эти грабли я наступил впервые ещё в университете в 90-ые. Чего потом удивляться что значение косинуса вычисляется по-разному? Не зря чуваки из Sun Microsystems очень долго пилили свою Java чтобы обеспечить одинаковые результаты вычислений на всех поддерживаемых платформах.
 
А вот особой потребности, скажем, в Ln(π) как-то вот не испытываю. Извините.
Это Вы извините, что напряг Вас с логарифмом Пи - это особая функция, что помогает входу члена в удлиненное влагалище.
 
Ну, если рассчитывать траекторию полёта космического аппарата куда-нибудь в пояс Койпера, то вполне возможно, потребуется точность выше 12 знаков, но для большинства применений и 6, а то и 3 хватит. Правда, автор темы не озвучил никаких особых требований.

Точный вещественный нуль можно получить только если задать константу 0 либо вычесть друг из друга два одинаковых вещественных числа (которые, в свою очередь, точно можно задать лишь константами). Результаты любых математических вычислений с вещественными числами может быть лишь приблизительным и очень сильно зависит от самих чисел из-за внутреннего представления.
 
Друзья, поскольку я вижу, что здесь собрались действительно профессионалы своего дела, попрошу все таки вас предложить свое решение на мою задачу. В принципе программу я и сам уже написал в некоторых версиях, но вот видится мне, что вы можете предложить куда более оптимальное решение (ввиду большого кол-ва циклов программа считает очень долго).
Итак, у нас есть эксп. значения теплового расширения при ряде температур:
TEC:array [1..20] of Real = (-0.4E-6, -1.9E-6, -4E-6, -4.5E-6, -4.38E-6, -3.9E-6, -2.9E-6, -2.23E-6, -1.8E-6, -1.7E-6, -1.7E-6,
-1.9E-6, -2.1E-6,-2.4E-6, -2.78E-6, -2.9E-6, -2.95E-6, -3.12E-6, -3.25E-6, -3.22E-6);
T:array [1..20] of Integer = (20,28,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210);

Задача подогонать модель под экспериментальные данные (т.е. по наименьшему среднеквадратическому отклонению).
Модельное тепловое расширение рассчитывается по формуле (1):
075c3-clip-7kb.webp
ΔV,V0,R - константы, что у меня есть;
с - фиксированная при определенном Т, варьируется от 0 до 1 (желаемая точность определения 0.01)
ΔS, U - константы, которые следует определить, неизменны при всех Т.
ΔS, U, c(T) и новая константа ΔЕ, которую также надо найти, должны удовлетворять следующим условиям:
Формула (2):
45de2-clip-6kb.webp
Итак первая производная формулы 2 должна быть равна нулю, вторая производная формулы (2) должна быть положительной. Р везде берется равное 1.
В результате программа должна находить ΔЕ, ΔS, U, фиксированные при всех Т, а также ряд значений с(Т), такими, чтобы среднеквадратическое отклонение параметра B (формула 1) от эксперименитального значения TEC было минимальным.
В случае если аналитического решения нет, то перебор должен быть в следующих диапазонах:
ΔS от -7 до 7 с шагом 0.01
ΔE от от -700 до 700 с шагом 1
U от 0 до 5000 с шагом 1
с от 0 до 1 с шагом 0.01
 
Забыл добавить, что первая и вторая производные частные по с.
 
Назад
Сверху