[Java] Wzór McLaurina i okresowość funkcji sin,cos,ex

calek
Użytkownik
Użytkownik
Posty: 5
Rejestracja: 8 mar 2017, o 01:46
Płeć: Mężczyzna
Lokalizacja: Krakow

[Java] Wzór McLaurina i okresowość funkcji sin,cos,ex

Post autor: calek »

Witam mam takie zadanie aby zrobić program który bedzie liczył funkcje \(\displaystyle{ \sin,\cos, e^x}\)
Korzystam ze wzorow pomijajac reszte:
\(\displaystyle{ \sin{x}=x-\frac{x^{3}}{3!}+\frac{x^{5}}{5!}+...+(-1^{n-1}) \cdot \frac{x^{2n-1}}{(2n-1)!} \\
\cos{x}=1-\frac{x^{2}}{2!}+\frac{x^{4}}{4!}+...+(-1^{n}) \cdot \frac{x^{2n}}{(2n)!} \\
e^{x}=1+\frac{x}{1!}+\frac{x^{2}}{2!}+...+\frac{x^{n-1}}{(n-1)!}}\)


Nie wiem jak uwzględnić okresowość funkcji (w ktorej ćwiartce), np jak podaje jako argument 1000 radianow to liczby z kosmosu wychodzą

Pozdrawiam z gory dziękuje za pomoc
Ostatnio zmieniony 12 mar 2017, o 15:57 przez Afish, łącznie zmieniany 2 razy.
Powód: Poprawa wiadomości. Symbol mnożenia to \cdot. Temat umieszczony w złym dziale.
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[Java] Wzór McLaurina i okresowość funkcji sin,cos,ex

Post autor: kalwi »

Pokaż kod.
calek
Użytkownik
Użytkownik
Posty: 5
Rejestracja: 8 mar 2017, o 01:46
Płeć: Mężczyzna
Lokalizacja: Krakow

[Java] Wzór McLaurina i okresowość funkcji sin,cos,ex

Post autor: calek »

Kod: Zaznacz cały

package zad;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Scanner;

public class Main {
	public static int factorial(int iNo) {

		if (iNo < 0)
			throw new IllegalArgumentException("iNo  >= 0");

		int factorial = 1;
		for (int i = 2; i <= iNo; i++)
			factorial *= i;

		return factorial;
	}

	public static double getMultiLastTwo(double liczba) {
		double y = 0;

		y = liczba - 1;

		return liczba * y;
	}

	public static double calcSin(double x, int ilosc_wyrazow) {
		double poprzedni_Licznik = 0;
		double poprzedni_Mianownik = factorial(3);
		double suma = 0;
		for (int n = 1; n <= ilosc_wyrazow; n++) {

			if (poprzedni_Licznik == 0) {
				poprzedni_Licznik = x;
				suma = x;
			} else {
				if (n > 2) {
					poprzedni_Licznik *= Math.pow(x, 2);
					poprzedni_Mianownik *= getMultiLastTwo((2 * n - 1));
					suma += (Math.pow(-1, n - 1)) * (poprzedni_Licznik / poprzedni_Mianownik);
				} else {
					poprzedni_Licznik = poprzedni_Licznik * Math.pow(x, 2);
					suma += (Math.pow(-1, n - 1)) * (poprzedni_Licznik / poprzedni_Mianownik);
				}

			}

		}

		return suma;

	}

	public static double calcCos(double x, int ilosc_wyrazow) {

		return calcSin(x + (Math.PI / 2), ilosc_wyrazow);

	}

	public static double calcEx(double d, int ilosc_wyrazow) {
		double poprzedni_Licznik = 1;
		double poprzedni_Mianownik = 1;
		double suma = 0;
		for (int n = 1; n <= ilosc_wyrazow; n++) {

			if (n > 1) {
				poprzedni_Licznik *= d;
				poprzedni_Mianownik *= (n - 1);
			}

			suma += poprzedni_Licznik / poprzedni_Mianownik;
		}
		return suma;

	}

	public static void addText(String content) {
		BufferedWriter bw = null;
		FileWriter fw = null;

		try {

			fw = new FileWriter(System.getProperty("user.home") + "/funkcje.txt", true);
			bw = new BufferedWriter(fw);
			bw.write(content + "
");

		} catch (IOException e) {

			e.printStackTrace();

		} finally {

			try {

				if (bw != null)
					bw.close();

				if (fw != null)
					fw.close();

			} catch (IOException ex) {

				ex.printStackTrace();

			}

		}

	}
	public static String diffrence(double arg1,double arg2){
		BigDecimal diff=null;  
		BigDecimal big=new BigDecimal(arg1);
		BigDecimal big2=new BigDecimal(arg2);
		if( arg1>arg2 )
		        diff=big.subtract(big2);
		    else
		        diff=big2.subtract(big);
		
		return "Roznica miedzy nimi: " +Math.abs(diff.floatValue());
	}
	public static void main(String[] args) {
		System.out.println("Wprowdasz funkcje (sin,cos,ex) : ");
		
		Scanner scanner = new Scanner(System.in);
		String funkcja = scanner.nextLine();
		System.out.println("Wprowdasz argument w radianach : ");
		//1000
		double argument = Double.parseDouble(scanner.nextLine());
		System.out.println("Wprowdasz ilosc wyrazow : ");
		int wyraz = Integer.parseInt(scanner.nextLine());
		if (funkcja.equalsIgnoreCase("sin")) {
			System.out.println("Funkcja sin wlasna: "+calcSin(argument, wyraz));
			System.out.println("Funkcja sin wbudowana: "+Math.sin(argument));
			System.out.println(diffrence(calcSin(argument, wyraz),Math.sin(argument)));
			
		}
		if (funkcja.equalsIgnoreCase("cos")) {
			System.out.println("Funkcja cos wlasna: "+calcCos(argument, wyraz));
			System.out.println("Funkcja cos wbudowana: "+Math.cos(argument));
			System.out.println(diffrence(calcCos(argument, wyraz),Math.cos(argument)));
		}
		if (funkcja.equalsIgnoreCase("ex")) {
			System.out.println("Funkcja ex wlasna: "+calcEx(argument, wyraz));
			System.out.println("Funkcja ex wbudowana: "+Math.exp(argument));
			System.out.println(diffrence(calcEx(argument, wyraz),Math.exp(argument)));
		}

	}

}
Ostatnio zmieniony 12 mar 2017, o 15:56 przez Afish, łącznie zmieniany 1 raz.
Powód: Umieszczaj kod na forum.
ODPOWIEDZ