You are on page 1of 4

#include <iostream>

using namespace std;

class unknowns

public:

double A;

double omega;

};

double* Cramer(double a, double b, double c, double d, double e, double f)

double* x = new double[4];

if ((a*d - b*c) == 0)

cout << "No solution" << endl;

else

x[0] = ((e * d) - (b * f)) / ((a * d) - (b * c));

x[1] = ((a * f) - (e * c)) / ((a * d) - (b * c));

return x;

unknowns optimize(double A0, double omega0, double* x, double* f)

unknowns obj;

double dS_dA = 0;

double d2S_dA2 = 0;

double dS_dOmega = 0;

double d2S_dOmega2 = 0;

double d2S_dA_dOmega = 0;

obj.A = A0;
obj.omega = omega0;

int n = 10;

while (n){

dS_dA = 0;

d2S_dA2 = 0;

dS_dOmega = 0;

d2S_dOmega2 = 0;

d2S_dA_dOmega = 0;

for (int i = 0; i<26; i++)

dS_dA += -(2 * sin(obj.omega*x[i])*(obj.A*sin(obj.omega*x[i]) - f[i]));

dS_dOmega += -(2 * obj.A*x[i] * cos(x[i] *


obj.omega)*(obj.A*sin(obj.omega*x[i]) - f[i]));

d2S_dA2 += 2 * sin(obj.omega*x[i])*sin(obj.omega*x[i]);

d2S_dOmega2 += 2 * pow(x[i], 2)*pow(obj.A, 2)*cos(x[i] *


obj.omega)*cos(x[i] * obj.omega) - 2 * pow(x[i], 2)*obj.A*sin(x[i] * obj.omega)*(obj.A*sin(x[i] *
obj.omega) - f[i]);

d2S_dA_dOmega += 2 * x[i] * cos(x[i] * obj.omega)*(obj.A*sin(x[i] *


obj.omega) - f[i]) + 2 * x[i] * obj.A*sin(x[i] * obj.omega)*cos(x[i] * obj.omega);

} obj.A += Cramer(d2S_dA2, d2S_dA_dOmega, d2S_dA_dOmega, d2S_dOmega2,


dS_dA, dS_dOmega)[0];

obj.omega += Cramer(d2S_dA2, d2S_dA_dOmega, d2S_dA_dOmega, d2S_dOmega2,


dS_dA, dS_dOmega)[1];

n--;

return obj;

int main()
{

double x[26] = { 0.0, 1.0, 1.3, 2.5, 3.0, 3.3, 4.5, 5.6, 6.0, 7.3, 7.8, 8.1, 8.9, 10.0, 11.0, 12.1,
12.9, 13.5,

14.2, 15.0, 15.8, 16.5, 17.1, 18.0, 19.5, 20.0 };

double f[26] = { 0.1, 1.2, 1.5, 3.8, 3.7, 4.5, 4.7, 5.2, 4.5, 4.3, 2.8, 3.1, 1.5, 0.8, -2.1, -2.1, -3.5, -
4.5, -4.5,

-5.3, -4.1, -4.5, -3.1, -3.7, -1.5, -0.1 };

cout << "A = " << optimize(5.0, 0.3, x, f).A << endl;

cout << "omega = " << optimize(5.0, 0.3, x, f).omega << endl;

system("PAUSE");

return 0;

You might also like