Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include <time.h>
- #include <string.h>
- // f(x, y) = 16x ^ 2 + 3y ^ 2, c = 13
- //x-y<=-2, x+y >= 2
- const int SIZE = 100;
- double func(double a, double b, double x, double y, double gamma) {
- return a * pow(x, 2) + b * pow(y, 2)+gamma*(pow(fmax(0.0, 2 + x - y),2)+pow(fmax(0, 2 - x - y),2));
- }
- double randOnRange(double min, double max) {
- double f = (double)rand() / RAND_MAX;
- return min + f * (max - min);
- };
- double gradientX(double a, double b, double gamma, double x, double y) {
- if ((x - y <= -2) && (x + y >= 2)) {
- return 2 * a * x;
- }
- else if ((x - y <= -2) && (x + y < 2)) {
- return 2 * a * x;
- }
- else if ((x - y > -2) && (x + y >= 2)) {
- return 2 * a * x - 2 * gamma * (2 + x - y);
- }
- else {
- return 2 * a * x - 2 * gamma * (2 + x - y);
- }
- }
- double gradientY(double a, double b, double gamma, double x, double y) {
- if ((x - y <= -2) && (x + y >= 2)) {
- return 2 * b * y;
- }
- else if ((x - y <= -2) && (x + y < 2)) {
- return 2 * b * y - 2 * gamma * (2 - x - y);
- }
- else if ((x - y > -2) && (x + y >= 2)) {
- return 2 * b * y;
- }
- else {
- return 2 * b * y - 2 * gamma * (2 - x - y);
- }
- }
- double maxL(double a, double b, double gamma) {
- if (2 * (a+gamma) > 2 * (b+gamma)) {
- return 2 * (a + gamma);
- }
- return 2 * (b + gamma);
- }
- double distGradient(const double &gradientX, const double &gradientY) {
- return sqrt(pow(gradientX, 2) + pow(gradientY, 2));
- }
- void task() {
- puts("task:");
- double a = 16;
- double b = 3;
- double c = 13;
- double accuracy = 0.01;
- double gamma = 1;
- int count = 0;
- double x = 0, y = 0,xn=0,yn=0, L=0;
- x = randOnRange(-1, 1);
- y = randOnRange(-1, 1);
- printf("%lf,%lf\n", x, y);
- for (int i = 0; i <= 9; i++) {
- double L = maxL(a, b, gamma);
- xn = x;
- yn = y;
- count = 0;
- for ( ; distGradient(gradientX(a,b,gamma,xn,yn), gradientY(a, b, gamma, xn, yn)) >= accuracy; ) {
- xn = xn - gradientX(a, b, gamma, xn, yn) / L;
- yn = yn - gradientY(a, b, gamma, xn, yn) / L;
- //printf("%lf\t%lf\t", xn, yn);
- count++;
- printf("%d xx\n", count);
- }
- printf("Count = %d, gamma = %5.1lf, x = %.7lf, y = %.7lf, func = %.7lf\n", count, gamma, xn,yn, func(a,b,xn,yn,gamma));
- gamma *= 2;
- }
- }
- int main() {
- srand(time(0));
- task();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement