⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 leontief.h

📁 利用C
💻 H
字号:
// Copyright (C) 2005 Anders Logg.// Licensed under the GNU LGPL Version 2.1.//// First added:  2005-04-01// Last changed: 2005#ifndef __LEONTIEF_H#define __LEONTIEF_H#include <dolfin.h>#include "Economy.h"using namespace dolfin;// Leontief economy (rational form)class Leontief : public Economy{public:  Leontief(unsigned int m, unsigned int n) : Economy(m, n)  {    init(&tmp0);    init(&tmp1);  }  void F(const complex z[], complex y[])  {    // First equation: normalization    y[0] = sum(z) - 1.0;    // Precompute scalar products    for (unsigned int i = 0; i < m; i++)      tmp0[i] = dot(w[i], z) / dot(a[i], z);        // Evaluate right-hand side    for (unsigned int j = 1; j < n; j++)    {      complex sum = 0.0;      for (unsigned int i = 0; i < m; i++)	sum += a[i][j] * tmp0[i] - w[i][j];      y[j] = sum;    }  }  void JF(const complex z[], const complex x[], complex y[])  {    // First equation: normalization    y[0] = sum(x);    // Precompute scalar products    for (unsigned int i = 0; i < m; i++)    {      const complex az = dot(a[i], z);      const complex wz = dot(w[i], z);      const complex ax = dot(a[i], x);      const complex wx = dot(w[i], x);      tmp0[i] = (az*wx - wz*ax) / (az*az);    }        // Evaluate right-hand side    for (unsigned int j = 1; j < n; j++)    {      complex sum = 0.0;      for (unsigned int i = 0; i < m; i++)	sum += a[i][j] * tmp0[i];      y[j] = sum;    }  }  unsigned int degree(unsigned int i) const  {    if ( i == 0 )      return 1;    else      return m;  }  };// Leontief economy (polynomial form)class PolynomialLeontief : public Economy{public:  PolynomialLeontief(unsigned int m, unsigned int n) : Economy(m, n)  {    // Special choice of data    a[0][0] = 2.0; a[0][1] = 1.0;    a[1][0] = 1.0; a[1][1] = 2.0;    w[0][0] = 1.0; w[0][1] = 2.0;    w[1][0] = 2.0; w[1][1] = 1.0;    init(&tmp0);    init(&tmp1);  }  void F(const complex z[], complex y[])  {    // First equation: normalization    y[0] = sum(z) - 1.0;    // Precompute scalar products a*z    for (unsigned int i = 0; i < m; i++)      tmp0[i] = dot(a[i], z);        // Precompute special products    for (unsigned int i = 0; i < m; i++)    {      complex tmp = dot(w[i], z);      for (unsigned int k = 0; k < m; k++)	if ( k != i )	  tmp *= tmp0[k];      tmp1[i] = tmp;    }        // Precompute special product    complex tmp = 1.0;    for (unsigned int i = 0; i < m; i++)      tmp *= tmp0[i];        // Evaluate right-hand side    for (unsigned int j = 1; j < n; j++)    {      complex sum = 0.0;      for (unsigned int i = 0; i < m; i++)	  sum += a[i][j] * tmp1[i] - w[i][j] * tmp;      y[j] = sum;    }  }  void JF(const complex z[], const complex x[], complex y[])  {    // First equation: normalization    y[0] = sum(x);    // Precompute scalar products a*z    for (unsigned int i = 0; i < m; i++)      tmp0[i] = dot(a[i], z);        // Evaluate first term    for (unsigned int i = 0; i < m; i++)    {      complex tmp = dot(w[i], x);      for (unsigned int k = 0; k < m; k++)	  if ( k != i )	    tmp *= tmp0[k];      tmp1[i] = tmp;    }    for (unsigned int j = 1; j < n; j++)    {      complex sum = 0.0;      for (unsigned int i = 0; i < m; i++)	sum += a[i][j] * tmp1[i];      y[j] = sum;    }        // Evaluate second term    for (unsigned int i = 0; i < m; i++)    {      complex sum = 0.0;      for (unsigned int k = 0; k < m; k++)      {	if ( k != i )	{	  complex product = 1.0;	  for (unsigned int r = 0; r < m; r++)	    if ( r != i && r != k )	      product *= tmp0[r];	  sum += dot(a[k], x);	}      }      tmp1[i] = dot(w[i], z) * sum;    }    for (unsigned int j = 1; j < n; j++)    {      complex sum = 0.0;      for (unsigned int i = 0; i < m; i++)	sum += a[i][j] * tmp1[i];      y[j] += sum;    }        // Evaluate third term    complex tmp = 0.0;    for (unsigned int k = 0; k < m; k++)    {      complex product = dot(a[k], x);      for (unsigned int r = 0; r < m; r++)	if ( r != k )	  product *= tmp0[r];      tmp += product;    }    for (unsigned int j = 1; j < n; j++)    {      complex sum = 0.0;      for (unsigned int i = 0; i < m; i++)	sum += w[i][j] * tmp;      y[j] -= sum;    }  }  unsigned int degree(unsigned int i) const  {    if ( i == 0 )      return 1;    else      return m;  }};#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -