Задача. Композиция [latex]n[/latex]- ого порядка [latex]f^{[n]}(x)[/latex] функции [latex]f(x)[/latex] назовем результат [latex]n[/latex]- кратного вычисления функции [latex]f [/latex], то есть [latex]f^{[1]}(x)=f(x)[/latex], [latex]f^{[ 2]}(x)=f(f(x))[/latex], и так далее. Для заданных [latex]n[/latex] и [latex]x[/latex] вычислить [latex] (expln)^{[n]} (x)[/latex] и [latex] exp^{[n]} ln^{[n]} (x)[/latex], результаты сравнить с [latex] x[/latex], то есть вывести значения аргумента, композиции функции и разности между ними.
[latex]x[/latex] | [latex]n[/latex] | [latex](expln)^{[n]}(x)[/latex] | [latex]exp^{[n]} ln^{[n]}(x)[/latex] | [latex]x-(expln)^{[n]}(x)[/latex] | [latex]x-exp^{[n]}ln^{[n]} (x)[/latex] |
3 | 3 | 3 | 3 | -4.44089e-16 | -4.44089e-16 |
3 | 4 | 3 | nan | -4.44089e-16 | nan |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#include <iostream> #include <math.h> using namespace std; double f(double x,int n)//композиция expln { if(n != 0) { x=exp(log(x)); return n<=1?x:f(x,n-1); } else return(x); } double fln(double x,int n) //логарифм композиции ln { if(n != 0) { x=log(x); return n<=1?x:fln(x,n-1); } else return(x); } double fexp(double x,int n) //алгоритм композиции exp { if(n!=0) { x=exp(x); return n<=1?x:fexp(x,n-1); } else return(x); } int main() { double x;int n=0; cin >> x >> n; printf("%lg %lg %lg %lg",f(x,n),fexp(fln(x,n),n),x-f(x,n),x-fexp(fln(x,n),n));//выводятся значения expln^n(x),exp^nln^n(x) и погрешности,возникшие при композиции этих функций return 0; } |
Задаем функцию, которая будет возвращать нам [latex]double[/latex] и иметь два параметра типа [latex]double[/latex] и [latex]int[/latex](число [latex]n[/latex]- количество композиций). В ней проверяем равна ли переменная нулю latex[/latex], если равна, то нет необходимости производить композицию, если же не равна нулю, то присваиваем [latex]x[/latex] значение функции и возвращаем [latex]x[/latex], если [latex]n<=1[/latex], иначе вызываем эту же функцию, но на порядок ниже latex[/latex] и так пока [latex]n==1[/latex] (то есть задаем рекурсию). Точно также описываем формулы [latex]exp[/latex] и [latex]ln[/latex] (В C++ [latex]log(x)[/latex]- это логарифм числа [latex]x[/latex] по основанию [latex]e[/latex]). В основной программе вызываем эти две функции и выводим их значения и разность между аргументом и значением функции для определения погрешности. (Возможны такие варианты, когда у вас будет логарифм отрицательным, что приведет к ответу [latex]nan[/latex])
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
/* package whatever; // don't place package name! */ import java.util.*; import java.lang.*; import java.io.*; /* Name of the class has to be "Main" only if the class is public. */ class Ideone { static double fln(double x, double n){ if(n != 0){ x = Math.log(x); return n <=1 ? x:fln(x, n-1); }else return x; } static double f(double x, double n){ if(n != 0){ x = Math.exp(Math.log(x)); return n <=1 ? x:f(x, n-1); }else return x; } static double fexp(double x, double n){ if(n != 0){ x = Math.exp(x); return n <=1 ? x:fexp(x, n-1); }else return x; } public static void main (String[] args) throws java.lang.Exception { Scanner in = new Scanner(System.in); double x = in.nextDouble(), n = in.nextDouble(); System.out.println(f(x,n)+" "+fexp(fln(x, n), n)+" "+ (x-f(x, n)) +" " + (x-fexp(fln(x, n), n))); } } |